diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-09-10 16:38:25 -0400 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-09-10 16:38:25 -0400 |
commit | 9bc72959cf8d4750de7f968fc35ea3b7463cad11 (patch) | |
tree | 5b75736d9f574bcc47394475bdf8d8060c8497ff /src | |
parent | 12d8c50580f06ba48fd1563508e49fcaabd936d0 (diff) | |
parent | 4829f4175482e0a4ad8f282dd0441904c33e2f97 (diff) |
Merge remote-tracking branch 'github/prop/litmus-signals' into wip-gpu-rtas12
Conflicts:
Makefile
Diffstat (limited to 'src')
-rw-r--r-- | src/litmus.c | 13 | ||||
-rw-r--r-- | src/signal.c | 107 | ||||
-rw-r--r-- | src/task.c | 4 |
3 files changed, 118 insertions, 6 deletions
diff --git a/src/litmus.c b/src/litmus.c index 4f404e2..3bab483 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 |
@@ -43,15 +43,19 @@ int be_migrate_to(int target_cpu) | |||
43 | 43 | ||
44 | int sporadic_task(lt_t e, lt_t p, lt_t phase, | 44 | int sporadic_task(lt_t e, lt_t p, lt_t phase, |
45 | int cpu, task_class_t cls, | 45 | int cpu, task_class_t cls, |
46 | budget_policy_t budget_policy, int set_cpu_set) | 46 | budget_policy_t budget_policy, |
47 | budget_signal_policy_t budget_signal_policy, | ||
48 | int set_cpu_set) | ||
47 | { | 49 | { |
48 | return sporadic_task_ns(e * NS_PER_MS, p * NS_PER_MS, phase * NS_PER_MS, | 50 | return sporadic_task_ns(e * NS_PER_MS, p * NS_PER_MS, phase * NS_PER_MS, |
49 | cpu, cls, budget_policy, set_cpu_set); | 51 | cpu, cls, budget_policy, budget_signal_policy, set_cpu_set); |
50 | } | 52 | } |
51 | 53 | ||
52 | int sporadic_task_ns(lt_t e, lt_t p, lt_t phase, | 54 | int sporadic_task_ns(lt_t e, lt_t p, lt_t phase, |
53 | int cpu, task_class_t cls, | 55 | int cpu, task_class_t cls, |
54 | budget_policy_t budget_policy, int set_cpu_set) | 56 | budget_policy_t budget_policy, |
57 | budget_signal_policy_t budget_signal_policy, | ||
58 | int set_cpu_set) | ||
55 | { | 59 | { |
56 | struct rt_task param; | 60 | struct rt_task param; |
57 | int ret; | 61 | int ret; |
@@ -67,6 +71,7 @@ int sporadic_task_ns(lt_t e, lt_t p, lt_t phase, | |||
67 | param.cls = cls; | 71 | param.cls = cls; |
68 | param.phase = phase; | 72 | param.phase = phase; |
69 | param.budget_policy = budget_policy; | 73 | param.budget_policy = budget_policy; |
74 | param.budget_signal_policy = budget_signal_policy; | ||
70 | 75 | ||
71 | if (set_cpu_set) { | 76 | if (set_cpu_set) { |
72 | ret = be_migrate_to(cpu); | 77 | ret = be_migrate_to(cpu); |
diff --git a/src/signal.c b/src/signal.c new file mode 100644 index 0000000..bfe18b9 --- /dev/null +++ b/src/signal.c | |||
@@ -0,0 +1,107 @@ | |||
1 | #include <stdio.h> | ||
2 | #include <string.h> | ||
3 | |||
4 | #include "litmus.h" | ||
5 | #include "internal.h" | ||
6 | |||
7 | /* setjmp calls are stored on a singlely link list, | ||
8 | * one stack per thread. | ||
9 | */ | ||
10 | static __thread litmus_sigjmp_t *g_sigjmp_tail = 0; | ||
11 | |||
12 | void push_sigjmp(litmus_sigjmp_t *buf) | ||
13 | { | ||
14 | buf->prev = g_sigjmp_tail; | ||
15 | g_sigjmp_tail = buf; | ||
16 | } | ||
17 | |||
18 | litmus_sigjmp_t* pop_sigjmp(void) | ||
19 | { | ||
20 | litmus_sigjmp_t* ret; | ||
21 | ret = g_sigjmp_tail; | ||
22 | g_sigjmp_tail = (ret) ? ret->prev : NULL; | ||
23 | return ret; | ||
24 | } | ||
25 | |||
26 | static void reg_litmus_signals(unsigned long litmus_sig_mask, | ||
27 | struct sigaction *pAction) | ||
28 | { | ||
29 | int ret; | ||
30 | |||
31 | if (litmus_sig_mask | SIG_BUDGET_MASK) { | ||
32 | ret = sigaction(SIG_BUDGET, pAction, NULL); | ||
33 | check("SIG_BUDGET"); | ||
34 | } | ||
35 | /* more signals ... */ | ||
36 | } | ||
37 | |||
38 | void ignore_litmus_signals(unsigned long litmus_sig_mask) | ||
39 | { | ||
40 | activate_litmus_signals(litmus_sig_mask, SIG_IGN); | ||
41 | } | ||
42 | |||
43 | void activate_litmus_signals(unsigned long litmus_sig_mask, | ||
44 | litmus_sig_handler_t handle) | ||
45 | { | ||
46 | struct sigaction action; | ||
47 | memset(&action, 0, sizeof(action)); | ||
48 | action.sa_handler = handle; | ||
49 | |||
50 | reg_litmus_signals(litmus_sig_mask, &action); | ||
51 | } | ||
52 | |||
53 | void activate_litmus_signal_actions(unsigned long litmus_sig_mask, | ||
54 | litmus_sig_actions_t handle) | ||
55 | { | ||
56 | struct sigaction action; | ||
57 | memset(&action, 0, sizeof(action)); | ||
58 | action.sa_sigaction = handle; | ||
59 | action.sa_flags = SA_SIGINFO; | ||
60 | |||
61 | reg_litmus_signals(litmus_sig_mask, &action); | ||
62 | } | ||
63 | |||
64 | void block_litmus_signals(unsigned long litmus_sig_mask) | ||
65 | { | ||
66 | int ret; | ||
67 | sigset_t sigs; | ||
68 | sigemptyset(&sigs); | ||
69 | |||
70 | if (litmus_sig_mask | SIG_BUDGET_MASK) { | ||
71 | sigaddset(&sigs, SIG_BUDGET); | ||
72 | } | ||
73 | /* more signals ... */ | ||
74 | |||
75 | ret = sigprocmask(SIG_BLOCK, &sigs, NULL); | ||
76 | check("SIG_BLOCK litmus signals"); | ||
77 | } | ||
78 | |||
79 | void unblock_litmus_signals(unsigned long litmus_sig_mask) | ||
80 | { | ||
81 | int ret; | ||
82 | sigset_t sigs; | ||
83 | sigemptyset(&sigs); | ||
84 | |||
85 | if (litmus_sig_mask | SIG_BUDGET_MASK) { | ||
86 | sigaddset(&sigs, SIG_BUDGET); | ||
87 | } | ||
88 | /* more ... */ | ||
89 | |||
90 | ret = sigprocmask(SIG_UNBLOCK, &sigs, NULL); | ||
91 | check("SIG_UNBLOCK litmus signals"); | ||
92 | } | ||
93 | |||
94 | |||
95 | void longjmp_on_litmus_signal(int signum) | ||
96 | { | ||
97 | /* We get signal! Main screen turn on! */ | ||
98 | litmus_sigjmp_t *lit_env; | ||
99 | lit_env = pop_sigjmp(); | ||
100 | if (lit_env) { | ||
101 | /* What you say?! */ | ||
102 | siglongjmp(lit_env->env, signum); /* restores signal mask */ | ||
103 | } | ||
104 | else { | ||
105 | /* silently ignore the signal */ | ||
106 | } | ||
107 | } | ||
@@ -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 | ||
43 | int __create_rt_task(rt_fn_t rt_prog, void *arg, int cpu, int wcet, int period, | 43 | int __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; |