Deleted Added
full compact
thr_sigwait.c (35509) thr_sigwait.c (38539)
1/*
2 * Copyright (c) 1997 John Birrell <jb@cimlogic.com.au>.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 25 unchanged lines hidden (view full) ---

34#include <errno.h>
35#ifdef _THREAD_SAFE
36#include <pthread.h>
37#include "pthread_private.h"
38
39int
40sigwait(const sigset_t * set, int *sig)
41{
1/*
2 * Copyright (c) 1997 John Birrell <jb@cimlogic.com.au>.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 25 unchanged lines hidden (view full) ---

34#include <errno.h>
35#ifdef _THREAD_SAFE
36#include <pthread.h>
37#include "pthread_private.h"
38
39int
40sigwait(const sigset_t * set, int *sig)
41{
42 int ret;
43 int status;
44 sigset_t oset;
42 int ret = 0;
43 int i;
44 sigset_t oset;
45 struct sigaction act;
46
47 /*
48 * Specify the thread kernel signal handler.
49 */
50 act.sa_handler = (void (*) ()) _thread_sig_handler;
51 act.sa_flags = SA_RESTART;
52 act.sa_mask = *set;
45
53
46 /* Save the current sigmal mask: */
47 oset = _thread_run->sigmask;
54 /*
55 * These signals can't be waited on.
56 */
57 sigdelset(&act.sa_mask, SIGKILL);
58 sigdelset(&act.sa_mask, SIGSTOP);
59 sigdelset(&act.sa_mask, SIGVTALRM);
60 sigdelset(&act.sa_mask, SIGCHLD);
61 sigdelset(&act.sa_mask, SIGINFO);
48
62
49 /* Combine the caller's mask with the current one: */
50 _thread_run->sigmask |= *set;
63 /*
64 * Enter a loop to find the signals that are SIG_DFL. For
65 * these signals we must install a dummy signal handler in
66 * order for the kernel to pass them in to us. POSIX says
67 * that the application must explicitly install a dummy
68 * handler for signals that are SIG_IGN in order to sigwait
69 * on them, so we ignore SIG_IGN signals.
70 */
71 for (i = 1; i < NSIG; i++) {
72 if (sigismember(&act.sa_mask, i)) {
73 if (_thread_sigact[i - 1].sa_handler == SIG_DFL) {
74 if (_thread_sys_sigaction(i,&act,NULL) != 0)
75 ret = -1;
76 }
77 else if (_thread_sigact[i - 1].sa_handler == SIG_IGN)
78 sigdelset(&act.sa_mask, i);
79 }
80 }
81 if (ret == 0) {
51
82
52 /* Wait for a signal: */
53 _thread_kern_sched_state(PS_SIGWAIT, __FILE__, __LINE__);
83 /* Save the current signal mask: */
84 oset = _thread_run->sigmask;
54
85
55 /* Return the signal number to the caller: */
56 *sig = _thread_run->signo;
86 /* Combine the caller's mask with the current one: */
87 _thread_run->sigmask |= act.sa_mask;
57
88
58 /* Restore the signal mask: */
59 _thread_run->sigmask = oset;
89 /* Wait for a signal: */
90 _thread_kern_sched_state(PS_SIGWAIT, __FILE__, __LINE__);
60
91
92 /* Return the signal number to the caller: */
93 *sig = _thread_run->signo;
94
95 /* Restore the signal mask: */
96 _thread_run->sigmask = oset;
97 }
98
99 /* Restore the sigactions: */
100 act.sa_handler = SIG_DFL;
101 for (i = 1; i < NSIG; i++) {
102 if (sigismember(&act.sa_mask, i) &&
103 (_thread_sigact[i - 1].sa_handler == SIG_DFL)) {
104 if (_thread_sys_sigaction(i,&act,NULL) != 0)
105 ret = -1;
106 }
107 }
108
61 /* Return the completion status: */
62 return (ret);
63}
64#endif
109 /* Return the completion status: */
110 return (ret);
111}
112#endif