aboutsummaryrefslogtreecommitdiffstats
path: root/src/signal.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/signal.c')
-rw-r--r--src/signal.c28
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 */
7static __thread litmus_sigjmp_t *g_sigjmp_tail = 0; 10static __thread litmus_sigjmp_t *g_sigjmp_tail = 0;
8 11
9void 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
24void push_sigjmp(litmus_sigjmp_t *buf) 12void 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)
31litmus_sigjmp_t* pop_sigjmp(void) 18litmus_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
52void ignore_litmus_signals(unsigned long litmus_sig_mask) 38void 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
109void longjmp_on_litmus_signal(int signum) 95void 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 {