aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-09-07 23:22:38 -0400
committerGlenn Elliott <gelliott@cs.unc.edu>2012-09-07 23:24:15 -0400
commit4829f4175482e0a4ad8f282dd0441904c33e2f97 (patch)
tree1ea66f39beaa1f1fcad08763eebc90537a403b5f /src
parent12587122ff78adffa2e8bcb571962d8f19365fb9 (diff)
Added signal-related comments. Made g++ friendly.prop/litmus-signals
Diffstat (limited to 'src')
-rw-r--r--src/litmus.c2
-rw-r--r--src/signal.c28
-rw-r--r--src/task.c4
3 files changed, 10 insertions, 24 deletions
diff --git a/src/litmus.c b/src/litmus.c
index aaaeee3..0b7c561 100644
--- a/src/litmus.c
+++ b/src/litmus.c
@@ -26,7 +26,7 @@ task_class_t str2class(const char* str)
26 else if (!strcmp(str, "be")) 26 else if (!strcmp(str, "be"))
27 return RT_CLASS_BEST_EFFORT; 27 return RT_CLASS_BEST_EFFORT;
28 else 28 else
29 return -1; 29 return (task_class_t)(-1);
30} 30}
31 31
32#define NS_PER_MS 1000000 32#define NS_PER_MS 1000000
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 {
diff --git a/src/task.c b/src/task.c
index 4d237bd..26fc15a 100644
--- a/src/task.c
+++ b/src/task.c
@@ -41,13 +41,13 @@ int __launch_rt_task(rt_fn_t rt_prog, void *rt_arg, rt_setup_fn_t setup,
41} 41}
42 42
43int __create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, int wcet, int period, 43int __create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, int wcet, int period,
44 task_class_t class) 44 task_class_t rt_class)
45{ 45{
46 struct rt_task params; 46 struct rt_task params;
47 params.cpu = cpu; 47 params.cpu = cpu;
48 params.period = period; 48 params.period = period;
49 params.exec_cost = wcet; 49 params.exec_cost = wcet;
50 params.cls = class; 50 params.cls = rt_class;
51 params.phase = 0; 51 params.phase = 0;
52 /* enforce budget for tasks that might not use sleep_next_period() */ 52 /* enforce budget for tasks that might not use sleep_next_period() */
53 params.budget_policy = QUANTUM_ENFORCEMENT; 53 params.budget_policy = QUANTUM_ENFORCEMENT;