summaryrefslogtreecommitdiffstats
path: root/misc/cgo/test/sigprocmask.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--misc/cgo/test/sigprocmask.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/misc/cgo/test/sigprocmask.c b/misc/cgo/test/sigprocmask.c
new file mode 100644
index 0000000..e77ba5b
--- /dev/null
+++ b/misc/cgo/test/sigprocmask.c
@@ -0,0 +1,51 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !windows
+
+#include <errno.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <time.h>
+#include <unistd.h>
+
+extern void IntoGoAndBack();
+
+int CheckBlocked() {
+ sigset_t mask;
+ sigprocmask(SIG_BLOCK, NULL, &mask);
+ return sigismember(&mask, SIGIO);
+}
+
+static void* sigthreadfunc(void* unused) {
+ sigset_t mask;
+ sigemptyset(&mask);
+ sigaddset(&mask, SIGIO);
+ sigprocmask(SIG_BLOCK, &mask, NULL);
+ IntoGoAndBack();
+ return NULL;
+}
+
+int RunSigThread() {
+ int tries;
+ pthread_t thread;
+ int r;
+ struct timespec ts;
+
+ for (tries = 0; tries < 20; tries++) {
+ r = pthread_create(&thread, NULL, &sigthreadfunc, NULL);
+ if (r == 0) {
+ return pthread_join(thread, NULL);
+ }
+ if (r != EAGAIN) {
+ return r;
+ }
+ ts.tv_sec = 0;
+ ts.tv_nsec = (tries + 1) * 1000 * 1000; // Milliseconds.
+ nanosleep(&ts, NULL);
+ }
+ return EAGAIN;
+}