1 6c746070 2004-05-23 devnull #include <u.h>
2 a46395ec 2003-10-01 devnull #include <signal.h>
3 6c746070 2004-05-23 devnull #include <libc.h>
5 6c746070 2004-05-23 devnull #define DBG 0
7 a46395ec 2003-10-01 devnull static void
8 a46395ec 2003-10-01 devnull ign(int x)
13 a46395ec 2003-10-01 devnull void /*__attribute__((constructor))*/
14 6c746070 2004-05-23 devnull ignusr1(int restart)
16 6c746070 2004-05-23 devnull struct sigaction sa;
18 6c746070 2004-05-23 devnull memset(&sa, 0, sizeof sa);
19 6c746070 2004-05-23 devnull sa.sa_handler = ign;
20 6c746070 2004-05-23 devnull sigemptyset(&sa.sa_mask);
21 6c746070 2004-05-23 devnull sigaddset(&sa.sa_mask, SIGUSR1);
22 6c746070 2004-05-23 devnull if(restart)
23 6c746070 2004-05-23 devnull sa.sa_flags = SA_RESTART;
24 6c746070 2004-05-23 devnull sigaction(SIGUSR1, &sa, nil);
28 bcf527a9 2004-09-17 devnull _procsleep(_Procrend *r)
30 bcf527a9 2004-09-17 devnull sigset_t mask;
33 bcf527a9 2004-09-17 devnull * Go to sleep.
35 bcf527a9 2004-09-17 devnull * Block USR1, set the handler to interrupt system calls,
36 bcf527a9 2004-09-17 devnull * unlock the vouslock so our waker can wake us,
37 bcf527a9 2004-09-17 devnull * and then suspend.
39 bcf527a9 2004-09-17 devnull r->asleep = 1;
40 bcf527a9 2004-09-17 devnull r->pid = getpid();
42 bcf527a9 2004-09-17 devnull sigprocmask(SIG_SETMASK, nil, &mask);
43 bcf527a9 2004-09-17 devnull sigaddset(&mask, SIGUSR1);
44 bcf527a9 2004-09-17 devnull sigprocmask(SIG_SETMASK, &mask, nil);
45 bcf527a9 2004-09-17 devnull ignusr1(0);
46 bcf527a9 2004-09-17 devnull unlock(r->l);
47 bcf527a9 2004-09-17 devnull sigdelset(&mask, SIGUSR1);
48 bcf527a9 2004-09-17 devnull sigsuspend(&mask);
51 bcf527a9 2004-09-17 devnull * We're awake. Make USR1 not interrupt system calls.
53 bcf527a9 2004-09-17 devnull ignusr1(1);
54 bcf527a9 2004-09-17 devnull assert(r->asleep == 0);
55 c6687d45 2004-09-21 devnull lock(r->l);
59 bcf527a9 2004-09-17 devnull _procwakeup(_Procrend *r)
61 bcf527a9 2004-09-17 devnull r->asleep = 0;
62 bcf527a9 2004-09-17 devnull assert(r->pid >= 1);
63 bcf527a9 2004-09-17 devnull kill(r->pid, SIGUSR1);