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 #include <afs/param.h>
23 #include <afs/procmgmt.h>
27 #include "pthread_nosigs.h"
29 /*------------------------------------------------------------------------
30 * Under Darwin 6.x (including 7.0), sigwait() is broken, so we use
31 * sigsuspend() instead. We also don't block signals we don't know
32 * about, so they should kill us, rather than us returning zero status.
33 *------------------------------------------------------------------------*/
35 static pthread_t softsig_tid;
37 void (*handler) (int);
39 #if !(defined(AFS_DARWIN_ENV) || (defined(AFS_NBSD_ENV) && !defined(AFS_NBSD50_ENV)))
41 #endif /* !defined(AFS_DARWIN_ENV) || !defined(AFS_NBSD_ENV) */
46 softsig_thread(void *arg)
52 /* get the list of signals _not_ blocked by AFS_SIGSET_CLEAR() */
53 pthread_sigmask(SIG_BLOCK, &ss, &os);
54 pthread_sigmask(SIG_SETMASK, &os, NULL);
55 sigaddset(&ss, SIGUSR1);
56 #if defined(AFS_DARWIN_ENV) || (defined(AFS_NBSD_ENV) && !defined(AFS_NBSD50_ENV))
57 pthread_sigmask (SIG_BLOCK, &ss, NULL);
58 sigdelset (&os, SIGUSR1);
59 #elif !defined(AFS_HPUX_ENV)
60 /* On HPUX, don't wait for 'critical' signals, as things such as
61 * SEGV won't cause a core, then. Some non-HPUX platforms may need
62 * this, though, since apparently if we wait on some signals but not
63 * e.g. SEGV, the softsig thread will still wait around when the
64 * other threads were killed by the SEGV. */
65 for (i = 0; i < NSIG; i++) {
66 if (!sigismember(&os, i) && i != SIGSTOP && i != SIGKILL) {
68 softsig_sigs[i].fatal = 1;
71 #endif /* defined(AFS_DARWIN_ENV) || defined(AFS_NBSD_ENV) */
75 #if !defined(AFS_DARWIN_ENV) && !defined(AFS_NBSD_ENV)
81 for (i = 0; i < NSIG; i++) {
82 if (softsig_sigs[i].handler && !softsig_sigs[i].inited) {
84 #if defined(AFS_DARWIN_ENV) || (defined(AFS_NBSD_ENV) && !defined(AFS_NBSD50_ENV))
85 pthread_sigmask (SIG_BLOCK, &ss, NULL);
87 #endif /* defined(AFS_DARWIN_ENV) || defined(AFS_NBSD_ENV) */
88 softsig_sigs[i].inited = 1;
90 if (softsig_sigs[i].pending) {
91 softsig_sigs[i].pending = 0;
92 h = softsig_sigs[i].handler;
97 #if defined(AFS_DARWIN_ENV) || (defined(AFS_NBSD_ENV) && !defined(AFS_NBSD50_ENV))
99 #else /* !defined(AFS_DARWIN_ENV) && !defined(AFS_NBSD_ENV) */
101 if (sigw != SIGUSR1) {
102 if (softsig_sigs[sigw].fatal)
104 softsig_sigs[sigw].pending = 1;
106 #endif /* defined(AFS_DARWIN_ENV) || defined(AFS_NBSD_ENV) */
114 softsig_usr1(int signo)
116 signal (SIGUSR1, softsig_usr1);
125 rc = pthread_create(&softsig_tid, NULL, &softsig_thread, NULL);
127 AFS_SIGSET_RESTORE();
128 signal (SIGUSR1, softsig_usr1);
132 softsig_handler(int signo)
134 signal(signo, softsig_handler);
135 softsig_sigs[signo].pending = 1;
136 pthread_kill(softsig_tid, SIGUSR1);
140 softsig_signal(int signo, void (*handler) (int))
142 softsig_sigs[signo].handler = handler;
143 softsig_sigs[signo].inited = 0;
144 signal(signo, softsig_handler);
145 pthread_kill(softsig_tid, SIGUSR1);
152 printf("foo, signo = %d, tid = %d\n", signo, pthread_self());
156 main(int argc, char **argv)
159 softsig_signal(SIGINT, print_foo);
160 printf("main is tid %d\n", pthread_self());