diff options
Diffstat (limited to '')
-rw-r--r-- | misc/cgo/test/sigprocmask.c | 51 |
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; +} |