Blame


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>
4 a46395ec 2003-10-01 devnull
5 6c746070 2004-05-23 devnull #define DBG 0
6 6c746070 2004-05-23 devnull
7 a46395ec 2003-10-01 devnull static void
8 a46395ec 2003-10-01 devnull ign(int x)
9 a46395ec 2003-10-01 devnull {
10 a46395ec 2003-10-01 devnull USED(x);
11 a46395ec 2003-10-01 devnull }
12 a46395ec 2003-10-01 devnull
13 a46395ec 2003-10-01 devnull void /*__attribute__((constructor))*/
14 6c746070 2004-05-23 devnull ignusr1(int restart)
15 a46395ec 2003-10-01 devnull {
16 6c746070 2004-05-23 devnull struct sigaction sa;
17 6c746070 2004-05-23 devnull
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);
25 a46395ec 2003-10-01 devnull }
26 a46395ec 2003-10-01 devnull
27 bcf527a9 2004-09-17 devnull void
28 bcf527a9 2004-09-17 devnull _procsleep(_Procrend *r)
29 a46395ec 2003-10-01 devnull {
30 bcf527a9 2004-09-17 devnull sigset_t mask;
31 a46395ec 2003-10-01 devnull
32 bcf527a9 2004-09-17 devnull /*
33 bcf527a9 2004-09-17 devnull * Go to sleep.
34 bcf527a9 2004-09-17 devnull *
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.
38 bcf527a9 2004-09-17 devnull */
39 bcf527a9 2004-09-17 devnull r->asleep = 1;
40 bcf527a9 2004-09-17 devnull r->pid = getpid();
41 a46395ec 2003-10-01 devnull
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);
49 a46395ec 2003-10-01 devnull
50 bcf527a9 2004-09-17 devnull /*
51 bcf527a9 2004-09-17 devnull * We're awake. Make USR1 not interrupt system calls.
52 bcf527a9 2004-09-17 devnull */
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);
56 6c746070 2004-05-23 devnull }
57 6c746070 2004-05-23 devnull
58 bcf527a9 2004-09-17 devnull void
59 bcf527a9 2004-09-17 devnull _procwakeup(_Procrend *r)
60 6c746070 2004-05-23 devnull {
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);
64 a46395ec 2003-10-01 devnull }