aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-09-10 16:38:25 -0400
committerGlenn Elliott <gelliott@cs.unc.edu>2012-09-10 16:38:25 -0400
commit9bc72959cf8d4750de7f968fc35ea3b7463cad11 (patch)
tree5b75736d9f574bcc47394475bdf8d8060c8497ff /src
parent12d8c50580f06ba48fd1563508e49fcaabd936d0 (diff)
parent4829f4175482e0a4ad8f282dd0441904c33e2f97 (diff)
Merge remote-tracking branch 'github/prop/litmus-signals' into wip-gpu-rtas12
Conflicts: Makefile
Diffstat (limited to 'src')
-rw-r--r--src/litmus.c13
-rw-r--r--src/signal.c107
-rw-r--r--src/task.c4
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
44int sporadic_task(lt_t e, lt_t p, lt_t phase, 44int 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
52int sporadic_task_ns(lt_t e, lt_t p, lt_t phase, 54int 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 */
10static __thread litmus_sigjmp_t *g_sigjmp_tail = 0;
11
12void push_sigjmp(litmus_sigjmp_t *buf)
13{
14 buf->prev = g_sigjmp_tail;
15 g_sigjmp_tail = buf;
16}
17
18litmus_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
26static 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
38void ignore_litmus_signals(unsigned long litmus_sig_mask)
39{
40 activate_litmus_signals(litmus_sig_mask, SIG_IGN);
41}
42
43void 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
53void 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
64void 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
79void 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
95void 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}
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;