| 128 | |
| 129 | |
| 130 | void sigwait_setup(sigset_t *set) |
| 131 | { |
| 132 | int i; |
| 133 | struct sigaction sact,sact1; |
| 134 | sigset_t unblock_mask; |
| 135 | |
| 136 | sact.sa_flags = 0; |
| 137 | sact.sa_handler = px_handle_sig; |
| 138 | memcpy(&sact.sa_mask, set, sizeof(*set)); /* handler isn't thread_safe */ |
| 139 | sigemptyset(&unblock_mask); |
| 140 | pthread_sigmask(SIG_UNBLOCK,(sigset_t*) 0,&rev_sigwait_set); |
| 141 | |
| 142 | for (i = 1; i <= sizeof(sigwait_set)*8; i++) |
| 143 | { |
| 144 | if (sigismember(set,i)) |
| 145 | { |
| 146 | sigdelset(&rev_sigwait_set,i); |
| 147 | if (!sigismember(&sigwait_set,i)) |
| 148 | sigaction(i, &sact, (struct sigaction*) 0); |
| 149 | } |
| 150 | else |
| 151 | { |
| 152 | sigdelset(&px_recd,i); /* Don't handle this */ |
| 153 | if (sigismember(&sigwait_set,i)) |
| 154 | { /* Remove the old handler */ |
| 155 | sigaddset(&unblock_mask,i); |
| 156 | sigdelset(&rev_sigwait_set,i); |
| 157 | sact1.sa_flags = 0; |
| 158 | sact1.sa_handler = SIG_DFL; |
| 159 | sigemptyset(&sact1.sa_mask); |
| 160 | sigaction(i, &sact1, 0); |
| 161 | } |
| 162 | } |
| 163 | } |
| 164 | memcpy(&sigwait_set, set, sizeof(*set)); |
| 165 | pthread_sigmask(SIG_BLOCK,(sigset_t*) set,(sigset_t*) 0); |
| 166 | pthread_sigmask(SIG_UNBLOCK,&unblock_mask,(sigset_t*) 0); |
| 167 | } |
| 168 | |
| 169 | |
| 170 | int sigwait(sigset_t *setp, int *sigp) |