2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
9 * Portions Copyright (c) 2003 Apple Computer, Inc.
12 #include <afsconfig.h>
13 #include <afs/param.h>
15 #define _POSIX_PTHREAD_SEMANTICS
16 #include <afs/param.h>
24 #include <afs/procmgmt.h>
28 #include "pthread_nosigs.h"
30 /*------------------------------------------------------------------------
31 * Under Darwin 6.x (including 7.0), sigwait() is broken, so we use
32 * sigsuspend() instead. We also don't block signals we don't know
33 * about, so they should kill us, rather than us returning zero status.
34 *------------------------------------------------------------------------*/
36 static pthread_t softsig_tid;
38 void (*handler) (int);
40 #if !(defined(AFS_DARWIN60_ENV) || (defined(AFS_NBSD_ENV) && !defined(AFS_NBSD50_ENV)))
42 #endif /* !defined(AFS_DARWIN60_ENV) || !defined(AFS_NBSD_ENV) */
47 softsig_thread(void *arg)
53 /* get the list of signals _not_ blocked by AFS_SIGSET_CLEAR() */
54 pthread_sigmask(SIG_BLOCK, &ss, &os);
55 pthread_sigmask(SIG_SETMASK, &os, NULL);
56 sigaddset(&ss, SIGUSR1);
57 #if defined(AFS_DARWIN60_ENV) || (defined(AFS_NBSD_ENV) && !defined(AFS_NBSD50_ENV))
58 pthread_sigmask (SIG_BLOCK, &ss, NULL);
59 sigdelset (&os, SIGUSR1);
60 #elif !defined(AFS_HPUX_ENV)
61 /* On HPUX, don't wait for 'critical' signals, as things such as
62 * SEGV won't cause a core, then. Some non-HPUX platforms may need
63 * this, though, since apparently if we wait on some signals but not
64 * e.g. SEGV, the softsig thread will still wait around when the
65 * other threads were killed by the SEGV. */
66 for (i = 0; i < NSIG; i++) {
67 if (!sigismember(&os, i) && i != SIGSTOP && i != SIGKILL) {
69 softsig_sigs[i].fatal = 1;
72 #endif /* defined(AFS_DARWIN60_ENV) || defined(AFS_NBSD_ENV) */
76 #if !defined(AFS_DARWIN60_ENV) && !defined(AFS_NBSD_ENV)
82 for (i = 0; i < NSIG; i++) {
83 if (softsig_sigs[i].handler && !softsig_sigs[i].inited) {
85 #if defined(AFS_DARWIN60_ENV) || (defined(AFS_NBSD_ENV) && !defined(AFS_NBSD50_ENV))
86 pthread_sigmask (SIG_BLOCK, &ss, NULL);
88 #endif /* defined(AFS_DARWIN60_ENV) || defined(AFS_NBSD_ENV) */
89 softsig_sigs[i].inited = 1;
91 if (softsig_sigs[i].pending) {
92 softsig_sigs[i].pending = 0;
93 h = softsig_sigs[i].handler;
98 #if defined(AFS_DARWIN60_ENV) || (defined(AFS_NBSD_ENV) && !defined(AFS_NBSD50_ENV))
100 #else /* !defined(AFS_DARWIN60_ENV) && !defined(AFS_NBSD_ENV) */
102 if (sigw != SIGUSR1) {
103 if (softsig_sigs[sigw].fatal)
105 softsig_sigs[sigw].pending = 1;
107 #endif /* defined(AFS_DARWIN60_ENV) || defined(AFS_NBSD_ENV) */
115 softsig_usr1(int signo)
117 signal (SIGUSR1, softsig_usr1);
126 rc = pthread_create(&softsig_tid, NULL, &softsig_thread, NULL);
128 AFS_SIGSET_RESTORE();
129 signal (SIGUSR1, softsig_usr1);
133 softsig_handler(int signo)
135 signal(signo, softsig_handler);
136 softsig_sigs[signo].pending = 1;
137 pthread_kill(softsig_tid, SIGUSR1);
141 softsig_signal(int signo, void (*handler) (int))
143 softsig_sigs[signo].handler = handler;
144 softsig_sigs[signo].inited = 0;
145 signal(signo, softsig_handler);
146 pthread_kill(softsig_tid, SIGUSR1);
153 printf("foo, signo = %d, tid = %d\n", signo, pthread_self());
157 main(int argc, char **argv)
160 softsig_signal(SIGINT, print_foo);
161 printf("main is tid %d\n", pthread_self());