diff options
Diffstat (limited to 'src/signal.c')
-rw-r--r-- | src/signal.c | 28 |
1 files changed, 7 insertions, 21 deletions
diff --git a/src/signal.c b/src/signal.c index a98ed78..bfe18b9 100644 --- a/src/signal.c +++ b/src/signal.c | |||
@@ -4,26 +4,13 @@ | |||
4 | #include "litmus.h" | 4 | #include "litmus.h" |
5 | #include "internal.h" | 5 | #include "internal.h" |
6 | 6 | ||
7 | /* setjmp calls are stored on a singlely link list, | ||
8 | * one stack per thread. | ||
9 | */ | ||
7 | static __thread litmus_sigjmp_t *g_sigjmp_tail = 0; | 10 | static __thread litmus_sigjmp_t *g_sigjmp_tail = 0; |
8 | 11 | ||
9 | void throw_litmus_signal(int signum) | ||
10 | { | ||
11 | litmus_sigjmp_t *lit_env; | ||
12 | |||
13 | printf("WE GET SIGNAL!\n"); | ||
14 | lit_env = pop_sigjmp(); | ||
15 | if (lit_env) { | ||
16 | printf("received signal %d!\n", signum); | ||
17 | siglongjmp(lit_env->env, signum); | ||
18 | } | ||
19 | else { | ||
20 | /* silently ignore the signal. */ | ||
21 | } | ||
22 | } | ||
23 | |||
24 | void push_sigjmp(litmus_sigjmp_t *buf) | 12 | void push_sigjmp(litmus_sigjmp_t *buf) |
25 | { | 13 | { |
26 | printf("push\n"); | ||
27 | buf->prev = g_sigjmp_tail; | 14 | buf->prev = g_sigjmp_tail; |
28 | g_sigjmp_tail = buf; | 15 | g_sigjmp_tail = buf; |
29 | } | 16 | } |
@@ -31,7 +18,6 @@ void push_sigjmp(litmus_sigjmp_t *buf) | |||
31 | litmus_sigjmp_t* pop_sigjmp(void) | 18 | litmus_sigjmp_t* pop_sigjmp(void) |
32 | { | 19 | { |
33 | litmus_sigjmp_t* ret; | 20 | litmus_sigjmp_t* ret; |
34 | printf("pop\n"); | ||
35 | ret = g_sigjmp_tail; | 21 | ret = g_sigjmp_tail; |
36 | g_sigjmp_tail = (ret) ? ret->prev : NULL; | 22 | g_sigjmp_tail = (ret) ? ret->prev : NULL; |
37 | return ret; | 23 | return ret; |
@@ -46,7 +32,7 @@ static void reg_litmus_signals(unsigned long litmus_sig_mask, | |||
46 | ret = sigaction(SIG_BUDGET, pAction, NULL); | 32 | ret = sigaction(SIG_BUDGET, pAction, NULL); |
47 | check("SIG_BUDGET"); | 33 | check("SIG_BUDGET"); |
48 | } | 34 | } |
49 | /* more ... */ | 35 | /* more signals ... */ |
50 | } | 36 | } |
51 | 37 | ||
52 | void ignore_litmus_signals(unsigned long litmus_sig_mask) | 38 | void ignore_litmus_signals(unsigned long litmus_sig_mask) |
@@ -84,7 +70,7 @@ void block_litmus_signals(unsigned long litmus_sig_mask) | |||
84 | if (litmus_sig_mask | SIG_BUDGET_MASK) { | 70 | if (litmus_sig_mask | SIG_BUDGET_MASK) { |
85 | sigaddset(&sigs, SIG_BUDGET); | 71 | sigaddset(&sigs, SIG_BUDGET); |
86 | } | 72 | } |
87 | /* more ... */ | 73 | /* more signals ... */ |
88 | 74 | ||
89 | ret = sigprocmask(SIG_BLOCK, &sigs, NULL); | 75 | ret = sigprocmask(SIG_BLOCK, &sigs, NULL); |
90 | check("SIG_BLOCK litmus signals"); | 76 | check("SIG_BLOCK litmus signals"); |
@@ -108,11 +94,11 @@ void unblock_litmus_signals(unsigned long litmus_sig_mask) | |||
108 | 94 | ||
109 | void longjmp_on_litmus_signal(int signum) | 95 | void longjmp_on_litmus_signal(int signum) |
110 | { | 96 | { |
97 | /* We get signal! Main screen turn on! */ | ||
111 | litmus_sigjmp_t *lit_env; | 98 | litmus_sigjmp_t *lit_env; |
112 | printf("WE GET SIGNAL!\n"); | ||
113 | lit_env = pop_sigjmp(); | 99 | lit_env = pop_sigjmp(); |
114 | if (lit_env) { | 100 | if (lit_env) { |
115 | printf("received signal %d\n", signum); | 101 | /* What you say?! */ |
116 | siglongjmp(lit_env->env, signum); /* restores signal mask */ | 102 | siglongjmp(lit_env->env, signum); /* restores signal mask */ |
117 | } | 103 | } |
118 | else { | 104 | else { |