aboutsummaryrefslogtreecommitdiffstats
path: root/rt-graph.c
diff options
context:
space:
mode:
Diffstat (limited to 'rt-graph.c')
-rw-r--r--rt-graph.c78
1 files changed, 62 insertions, 16 deletions
diff --git a/rt-graph.c b/rt-graph.c
index 6eab52f..71f2033 100644
--- a/rt-graph.c
+++ b/rt-graph.c
@@ -1,5 +1,16 @@
1#include "rt-graph.h" 1#include "rt-graph.h"
2#include "trace-hash.h"
2 3
4#define DEBUG_LEVEL 1
5#if DEBUG_LEVEL > 0
6#define dprintf(l, x...) \
7 do { \
8 if (l <= DEBUG_LEVEL) \
9 printf(x); \
10 } while (0)
11#else
12#define dprintf(l, x...) do { if (0) printf(x); } while (0)
13#endif
3/** 14/**
4 * rt_graph_check_task_param - check for litmus_task_param record 15 * rt_graph_check_task_param - check for litmus_task_param record
5 * Return 1 and @pid, @wcet, and @period if the record matches 16 * Return 1 and @pid, @wcet, and @period if the record matches
@@ -22,8 +33,9 @@ int rt_graph_check_task_param(struct rt_graph_info *rtinfo,
22 event = pevent_find_event_by_name(pevent, "litmus", 33 event = pevent_find_event_by_name(pevent, "litmus",
23 "litmus_task_param"); 34 "litmus_task_param");
24 if (!event) 35 if (!event)
25 return 0; 36 goto out;
26 rtinfo->task_param_id = event->id; 37 rtinfo->task_param_id = event->id;
38 dprintf(2, "Found task_param id %d\n", event->id);
27 rtinfo->param_pid_field = pevent_find_field(event, "pid"); 39 rtinfo->param_pid_field = pevent_find_field(event, "pid");
28 rtinfo->param_wcet_field = pevent_find_field(event, "wcet"); 40 rtinfo->param_wcet_field = pevent_find_field(event, "wcet");
29 rtinfo->param_period_field = pevent_find_field(event, "period"); 41 rtinfo->param_period_field = pevent_find_field(event, "period");
@@ -39,8 +51,13 @@ int rt_graph_check_task_param(struct rt_graph_info *rtinfo,
39 pevent_read_number_field(rtinfo->param_period_field, 51 pevent_read_number_field(rtinfo->param_period_field,
40 record->data, period); 52 record->data, period);
41 ret = 1; 53 ret = 1;
42 } 54 dprintf(3, "Read task_param (%d) record for task %d "
55 "(%llu, %llu)\n", id, *pid, *wcet, *period);
43 56
57 /* Only of these per task, so we can safely add new tasks now */
58 add_task_hash(rtinfo->tasks, *pid);
59 }
60 out:
44 return ret; 61 return ret;
45} 62}
46 63
@@ -50,7 +67,7 @@ int rt_graph_check_task_param(struct rt_graph_info *rtinfo,
50 */ 67 */
51int rt_graph_check_task_release(struct rt_graph_info *rtinfo, 68int rt_graph_check_task_release(struct rt_graph_info *rtinfo,
52 struct pevent *pevent, struct record *record, 69 struct pevent *pevent, struct record *record,
53 gint *pid, gint *job, 70 gint *pid, gint *job, unsigned long long *release,
54 unsigned long long *deadline) 71 unsigned long long *deadline)
55{ 72{
56 struct event_format *event; 73 struct event_format *event;
@@ -62,10 +79,12 @@ int rt_graph_check_task_release(struct rt_graph_info *rtinfo,
62 event = pevent_find_event_by_name(pevent, "litmus", 79 event = pevent_find_event_by_name(pevent, "litmus",
63 "litmus_task_release"); 80 "litmus_task_release");
64 if (!event) 81 if (!event)
65 return 0; 82 goto out;
66 rtinfo->task_release_id = event->id; 83 rtinfo->task_release_id = event->id;
84 dprintf(2, "Found task_release id %d\n", event->id);
67 rtinfo->release_pid_field = pevent_find_field(event, "pid"); 85 rtinfo->release_pid_field = pevent_find_field(event, "pid");
68 rtinfo->release_job_field = pevent_find_field(event, "job"); 86 rtinfo->release_job_field = pevent_find_field(event, "job");
87 rtinfo->release_release_field = pevent_find_field(event, "release");
69 rtinfo->release_deadline_field = pevent_find_field(event, "deadline"); 88 rtinfo->release_deadline_field = pevent_find_field(event, "deadline");
70 } 89 }
71 90
@@ -77,11 +96,15 @@ int rt_graph_check_task_release(struct rt_graph_info *rtinfo,
77 pevent_read_number_field(rtinfo->release_job_field, 96 pevent_read_number_field(rtinfo->release_job_field,
78 record->data, &val); 97 record->data, &val);
79 *job = val; 98 *job = val;
99 pevent_read_number_field(rtinfo->release_release_field,
100 record->data, release);
80 pevent_read_number_field(rtinfo->release_deadline_field, 101 pevent_read_number_field(rtinfo->release_deadline_field,
81 record->data, deadline); 102 record->data, deadline);
82 ret = 1; 103 ret = 1;
104 dprintf(3, "Read task_release (%d) record for job %d:%d, "
105 "dead: %llu\n", id, *pid, *job, *deadline);
83 } 106 }
84 107 out:
85 return ret; 108 return ret;
86} 109}
87 110
@@ -91,21 +114,23 @@ int rt_graph_check_task_release(struct rt_graph_info *rtinfo,
91 */ 114 */
92int rt_graph_check_task_completion(struct rt_graph_info *rtinfo, 115int rt_graph_check_task_completion(struct rt_graph_info *rtinfo,
93 struct pevent *pevent, struct record *record, 116 struct pevent *pevent, struct record *record,
94 gint *pid, gint *job) 117 gint *pid, gint *job, unsigned long long *when)
95{ 118{
96 struct event_format *event; 119 struct event_format *event;
97 unsigned long long val; 120 unsigned long long val;
98 gint id; 121 gint id;
99 int ret = 0; 122 int ret = 0;
100 123
101 if (rtinfo->task_param_id < 0) { 124 if (rtinfo->task_completion_id < 0) {
102 event = pevent_find_event_by_name(pevent, "litmus", 125 event = pevent_find_event_by_name(pevent, "litmus",
103 "litmus_task_completion"); 126 "litmus_task_completion");
104 if (!event) 127 if (!event)
105 return 0; 128 goto out;
106 rtinfo->task_completion_id = event->id; 129 rtinfo->task_completion_id = event->id;
130 dprintf(2, "Found task_completion id %d\n", event->id);
107 rtinfo->completion_pid_field = pevent_find_field(event, "pid"); 131 rtinfo->completion_pid_field = pevent_find_field(event, "pid");
108 rtinfo->completion_job_field = pevent_find_field(event, "job"); 132 rtinfo->completion_job_field = pevent_find_field(event, "job");
133 rtinfo->completion_when_field = pevent_find_field(event, "when");
109 } 134 }
110 135
111 id = pevent_data_type(pevent, record); 136 id = pevent_data_type(pevent, record);
@@ -116,9 +141,13 @@ int rt_graph_check_task_completion(struct rt_graph_info *rtinfo,
116 pevent_read_number_field(rtinfo->completion_job_field, 141 pevent_read_number_field(rtinfo->completion_job_field,
117 record->data, &val); 142 record->data, &val);
118 *job = val; 143 *job = val;
144 pevent_read_number_field(rtinfo->completion_when_field,
145 record->data, when);
119 ret = 1; 146 ret = 1;
147 dprintf(3, "Read task_completion (%d) record for job %d:%d\n",
148 id, *pid, *job);
120 } 149 }
121 150 out:
122 return ret; 151 return ret;
123} 152}
124 153
@@ -128,7 +157,7 @@ int rt_graph_check_task_completion(struct rt_graph_info *rtinfo,
128 */ 157 */
129int rt_graph_check_task_block(struct rt_graph_info *rtinfo, 158int rt_graph_check_task_block(struct rt_graph_info *rtinfo,
130 struct pevent *pevent, struct record *record, 159 struct pevent *pevent, struct record *record,
131 gint *pid) 160 gint *pid, unsigned long long *when)
132{ 161{
133 struct event_format *event; 162 struct event_format *event;
134 unsigned long long val; 163 unsigned long long val;
@@ -139,9 +168,11 @@ int rt_graph_check_task_block(struct rt_graph_info *rtinfo,
139 event = pevent_find_event_by_name(pevent, "litmus", 168 event = pevent_find_event_by_name(pevent, "litmus",
140 "litmus_task_block"); 169 "litmus_task_block");
141 if (!event) 170 if (!event)
142 return 0; 171 goto out;
172 dprintf(2, "Found task_block id %d\n", event->id);
143 rtinfo->task_block_id = event->id; 173 rtinfo->task_block_id = event->id;
144 rtinfo->block_pid_field = pevent_find_field(event, "pid"); 174 rtinfo->block_pid_field = pevent_find_field(event, "pid");
175 rtinfo->block_when_field = pevent_find_field(event, "when");
145 } 176 }
146 177
147 id = pevent_data_type(pevent, record); 178 id = pevent_data_type(pevent, record);
@@ -149,9 +180,13 @@ int rt_graph_check_task_block(struct rt_graph_info *rtinfo,
149 pevent_read_number_field(rtinfo->block_pid_field, 180 pevent_read_number_field(rtinfo->block_pid_field,
150 record->data, &val); 181 record->data, &val);
151 *pid = val; 182 *pid = val;
183 pevent_read_number_field(rtinfo->block_when_field,
184 record->data, when);
152 ret = 1; 185 ret = 1;
186 dprintf(3, "Read task_block (%d) record for task %d\n",
187 id, *pid);
153 } 188 }
154 189 out:
155 return ret; 190 return ret;
156} 191}
157 192
@@ -161,7 +196,7 @@ int rt_graph_check_task_block(struct rt_graph_info *rtinfo,
161 */ 196 */
162int rt_graph_check_task_resume(struct rt_graph_info *rtinfo, 197int rt_graph_check_task_resume(struct rt_graph_info *rtinfo,
163 struct pevent *pevent, struct record *record, 198 struct pevent *pevent, struct record *record,
164 gint *pid) 199 gint *pid, unsigned long long *when)
165{ 200{
166 struct event_format *event; 201 struct event_format *event;
167 unsigned long long val; 202 unsigned long long val;
@@ -172,9 +207,11 @@ int rt_graph_check_task_resume(struct rt_graph_info *rtinfo,
172 event = pevent_find_event_by_name(pevent, "litmus", 207 event = pevent_find_event_by_name(pevent, "litmus",
173 "litmus_task_resume"); 208 "litmus_task_resume");
174 if (!event) 209 if (!event)
175 return 0; 210 goto out;
211 dprintf(2, "Found task_resume id %d\n", event->id);
176 rtinfo->task_resume_id = event->id; 212 rtinfo->task_resume_id = event->id;
177 rtinfo->resume_pid_field = pevent_find_field(event, "pid"); 213 rtinfo->resume_pid_field = pevent_find_field(event, "pid");
214 rtinfo->resume_when_field = pevent_find_field(event, "when");
178 } 215 }
179 216
180 id = pevent_data_type(pevent, record); 217 id = pevent_data_type(pevent, record);
@@ -182,9 +219,13 @@ int rt_graph_check_task_resume(struct rt_graph_info *rtinfo,
182 pevent_read_number_field(rtinfo->resume_pid_field, 219 pevent_read_number_field(rtinfo->resume_pid_field,
183 record->data, &val); 220 record->data, &val);
184 *pid = val; 221 *pid = val;
222 pevent_read_number_field(rtinfo->resume_when_field,
223 record->data, when);
185 ret = 1; 224 ret = 1;
225 dprintf(3, "Read task_resume (%d) record for task %d\n",
226 id, *pid);
186 } 227 }
187 228 out:
188 return ret; 229 return ret;
189} 230}
190 231
@@ -193,7 +234,7 @@ int rt_graph_check_task_resume(struct rt_graph_info *rtinfo,
193 */ 234 */
194void init_rt_event_cache(struct rt_graph_info *rtinfo) 235void init_rt_event_cache(struct rt_graph_info *rtinfo)
195{ 236{
196 print("hello"); 237 dprintf(1, "Initializing RT event cache\n");
197 rtinfo->task_param_id = -1; 238 rtinfo->task_param_id = -1;
198 rtinfo->task_release_id = -1; 239 rtinfo->task_release_id = -1;
199 rtinfo->task_completion_id = -1; 240 rtinfo->task_completion_id = -1;
@@ -206,11 +247,16 @@ void init_rt_event_cache(struct rt_graph_info *rtinfo)
206 247
207 rtinfo->release_pid_field = NULL; 248 rtinfo->release_pid_field = NULL;
208 rtinfo->release_job_field = NULL; 249 rtinfo->release_job_field = NULL;
250 rtinfo->release_release_field = NULL;
209 rtinfo->release_deadline_field = NULL; 251 rtinfo->release_deadline_field = NULL;
210 252
211 rtinfo->completion_pid_field = NULL; 253 rtinfo->completion_pid_field = NULL;
212 rtinfo->completion_job_field = NULL; 254 rtinfo->completion_job_field = NULL;
255 rtinfo->completion_when_field = NULL;
213 256
214 rtinfo->block_pid_field = NULL; 257 rtinfo->block_pid_field = NULL;
258 rtinfo->block_when_field = NULL;
259
215 rtinfo->resume_pid_field = NULL; 260 rtinfo->resume_pid_field = NULL;
261 rtinfo->resume_when_field = NULL;
216} 262}