1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19: #include <hurd/sigpreempt.h>
20: #include <hurd/signal.h>
21: #include <assert.h>
22:
23: void
24: hurd_preempt_signals (struct hurd_signal_preemptor *preemptor)
25: {
26: __mutex_lock (&_hurd_siglock);
27: preemptor->next = _hurdsig_preemptors;
28: _hurdsig_preemptors = preemptor;
29: _hurdsig_preempted_set |= preemptor->signals;
30: __mutex_unlock (&_hurd_siglock);
31: }
32:
33: void
34: hurd_unpreempt_signals (struct hurd_signal_preemptor *preemptor)
35: {
36: struct hurd_signal_preemptor **p;
37: sigset_t preempted = 0;
38:
39: __mutex_lock (&_hurd_siglock);
40:
41: p = &_hurdsig_preemptors;
42: while (*p)
43: if (*p == preemptor)
44: {
45:
46: *p = (*p)->next;
47: if ((preemptor->signals & preempted) != preemptor->signals)
48: {
49:
50:
51:
52: struct hurd_signal_preemptor *pp;
53: for (pp = *p; pp; pp = pp->next)
54: preempted |= pp->signals;
55: _hurdsig_preempted_set = preempted;
56: }
57: __mutex_unlock (&_hurd_siglock);
58: return;
59: }
60: else
61: {
62: preempted |= (*p)->signals;
63: p = &(*p)->next;
64: }
65:
66: __mutex_unlock (&_hurd_siglock);
67: assert (! "removing absent preemptor");
68: }