Rev 1655 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1655 | giacomo | 1 | /* |
2 | * Project: HARTIK (HA-rd R-eal TI-me K-ernel) |
||
3 | * |
||
4 | * Coordinators: Giorgio Buttazzo <giorgio@sssup.it> |
||
5 | * Gerardo Lamastra <gerardo@sssup.it> |
||
6 | * |
||
7 | * Authors : Massimiliano Giorgi <massy@hartik.sssup.it> |
||
8 | * (see authors.txt for full list of hartik's authors) |
||
9 | * |
||
10 | * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
||
11 | * |
||
12 | * http://www.sssup.it |
||
13 | * http://retis.sssup.it |
||
14 | * http://hartik.sssup.it |
||
15 | */ |
||
16 | |||
17 | /* |
||
18 | * Copyright (C) 1999 Massimiliano Giorgi |
||
19 | * |
||
20 | * This program is free software; you can redistribute it and/or modify |
||
21 | * it under the terms of the GNU General Public License as published by |
||
22 | * the Free Software Foundation; either version 2 of the License, or |
||
23 | * (at your option) any later version. |
||
24 | * |
||
25 | * This program is distributed in the hope that it will be useful, |
||
26 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
27 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
28 | * GNU General Public License for more details. |
||
29 | * |
||
30 | * You should have received a copy of the GNU General Public License |
||
31 | * along with this program; if not, write to the Free Software |
||
32 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||
33 | * |
||
34 | */ |
||
35 | |||
36 | /* |
||
37 | * CVS : $Id: jdump.c,v 1.1.1.1 2004-05-24 18:03:44 giacomo Exp $ |
||
38 | * |
||
39 | * File: $File$ |
||
40 | * Revision: $Revision: 1.1.1.1 $ |
||
41 | * Last update: $Date: 2004-05-24 18:03:44 $ |
||
42 | */ |
||
43 | |||
44 | #include <netinet/in.h> |
||
45 | #include <stdio.h> |
||
46 | #include <string.h> |
||
47 | #include <unistd.h> |
||
48 | #include <fcntl.h> |
||
49 | |||
50 | #include "types.h" |
||
51 | #include <trace.h> |
||
52 | #include "util.h" |
||
53 | |||
54 | /* |
||
55 | * |
||
56 | * This filter converts trace file formats from SHARK to JTRACER |
||
57 | * |
||
58 | */ |
||
59 | |||
60 | /* All times are dived by this costant. */ |
||
61 | #define TIMESCALE 1 |
||
62 | |||
63 | /* If defined dump on stdout the packets (in ascii) that will be written |
||
64 | * on the output file (the file of the tracer). |
||
65 | */ |
||
66 | |||
67 | #define DUMPOUT |
||
68 | |||
69 | /* |
||
70 | * |
||
71 | * |
||
72 | * |
||
73 | */ |
||
74 | |||
75 | int pippo=0; |
||
76 | |||
77 | int writeInt(int h, int x) |
||
78 | { |
||
79 | int y,res; |
||
80 | y=htonl(x); |
||
81 | res=write(h,&y,sizeof(int)); |
||
82 | return res!=sizeof(int); |
||
83 | } |
||
84 | |||
85 | |||
86 | int writeStr(int h, char *s) |
||
87 | { |
||
88 | int res,size; |
||
89 | size=strlen(s); |
||
90 | writeInt(h,size); |
||
91 | res=write(h,s,size); |
||
92 | return res!=size; |
||
93 | } |
||
94 | |||
95 | /* |
||
96 | * |
||
97 | */ |
||
98 | |||
99 | #define TASK_ARRIVAL 0 |
||
100 | #define TASK_SCHEDULE 1 |
||
101 | #define TASK_DESCHEDULE 2 |
||
102 | #define TASK_END 3 |
||
103 | #define TASK_DLINEPOST 4 |
||
104 | #define TASK_DLINESET 5 |
||
105 | #define TASK_WAIT 6 |
||
106 | #define TASK_SIGNAL 7 |
||
107 | #define TASK_IDLE 8 |
||
108 | #define TASK_NAME 9 |
||
109 | |||
110 | #define EVT_NUMBER 10 |
||
111 | |||
112 | char *eventsname[]={ |
||
113 | "task_arrival", |
||
114 | "task_schedule", |
||
115 | "task_deschedule", |
||
116 | "task_end", |
||
117 | "task_dlinepost", |
||
118 | "task_dlineset", |
||
119 | "task_wait", |
||
120 | "task_signal", |
||
121 | "task_idle", |
||
122 | "task_name" |
||
123 | }; |
||
124 | |||
125 | struct j_evt_prolog { |
||
126 | int type; |
||
127 | int time; |
||
128 | }; |
||
129 | |||
130 | struct j_evt_task { |
||
131 | struct j_evt_prolog p; |
||
132 | int task; |
||
133 | }; |
||
134 | |||
135 | struct j_evt_dlinepost { |
||
136 | struct j_evt_task t; |
||
137 | int taskD; |
||
138 | int taskD2; |
||
139 | }; |
||
140 | |||
141 | struct j_evt_dlineset { |
||
142 | struct j_evt_task t; |
||
143 | int taskD; |
||
144 | }; |
||
145 | |||
146 | struct j_evt_semaph { |
||
147 | struct j_evt_task t; |
||
148 | int res; |
||
149 | char *name; |
||
150 | }; |
||
151 | |||
152 | struct j_evt_name { |
||
153 | struct j_evt_task t; |
||
154 | char *name; |
||
155 | }; |
||
156 | |||
157 | /* |
||
158 | * |
||
159 | */ |
||
160 | |||
161 | int j_write_prolog(int h, void *ptr) |
||
162 | { |
||
163 | #ifdef DUMPOUT |
||
164 | printf("%10i ",((struct j_evt_prolog *)ptr)->time); |
||
165 | printf("%-18s ",eventsname[((struct j_evt_prolog *)ptr)->type]); |
||
166 | #endif |
||
167 | if (writeInt(h,((struct j_evt_prolog *)ptr)->type)) return -2; |
||
168 | if (writeInt(h,((struct j_evt_prolog *)ptr)->time)) return -3; |
||
169 | return 0; |
||
170 | } |
||
171 | |||
172 | int j_write_task(int h, void *ptr) |
||
173 | { |
||
174 | int res; |
||
175 | res=j_write_prolog(h,ptr); |
||
176 | #ifdef DUMPOUT |
||
177 | printf("tsk=%i ",((struct j_evt_task *)ptr)->task); |
||
178 | #endif |
||
179 | if (res) return res; |
||
180 | if (writeInt(h,((struct j_evt_task *)ptr)->task)) return -4; |
||
181 | return 0; |
||
182 | } |
||
183 | |||
184 | int j_write_dlinepost(int h, void *ptr) |
||
185 | { |
||
186 | int res; |
||
187 | res=j_write_task(h,ptr); |
||
188 | if (res) return res; |
||
189 | if (writeInt(h,((struct j_evt_dlinepost *)ptr)->taskD)) return -5; |
||
190 | if (writeInt(h,((struct j_evt_dlinepost *)ptr)->taskD2)) return -6; |
||
191 | return 0; |
||
192 | } |
||
193 | |||
194 | int j_write_dlineset(int h, void *ptr) |
||
195 | { |
||
196 | int res; |
||
197 | res=j_write_task(h,ptr); |
||
198 | if (res) return res; |
||
199 | if (writeInt(h,((struct j_evt_dlineset *)ptr)->taskD)) return -7; |
||
200 | return 0; |
||
201 | } |
||
202 | |||
203 | int j_write_semaph(int h, void *ptr) |
||
204 | { |
||
205 | int res; |
||
206 | res=j_write_task(h,ptr); |
||
207 | if (res) return res; |
||
208 | if (writeInt(h,((struct j_evt_semaph *)ptr)->res)) return -8; |
||
209 | if (writeStr(h,((struct j_evt_semaph *)ptr)->name)) return -9; |
||
210 | return 0; |
||
211 | } |
||
212 | |||
213 | int j_write_name(int h, void *ptr) |
||
214 | { |
||
215 | int res; |
||
216 | res=j_write_task(h,ptr); |
||
217 | #ifdef DUMPOUT |
||
218 | printf("name='%s' ",((struct j_evt_name *)ptr)->name); |
||
219 | #endif |
||
220 | if (res) return res; |
||
221 | if (writeStr(h,((struct j_evt_name *)ptr)->name)) return -10; |
||
222 | return 0; |
||
223 | } |
||
224 | |||
225 | int writeEvent(int h, void *ptr) |
||
226 | { |
||
227 | int res; |
||
228 | |||
229 | //printf("<%i>",((struct j_evt_prolog*)ptr)->type); |
||
230 | |||
231 | ((struct j_evt_prolog*)ptr)->time/=TIMESCALE; |
||
232 | |||
233 | switch(((struct j_evt_prolog*)ptr)->type) { |
||
234 | case TASK_ARRIVAL: |
||
235 | case TASK_SCHEDULE: |
||
236 | case TASK_DESCHEDULE: |
||
237 | case TASK_END: |
||
238 | case TASK_IDLE: |
||
239 | res=j_write_task(h,ptr); |
||
240 | break; |
||
241 | case TASK_DLINEPOST: |
||
242 | res=j_write_dlinepost(h,ptr); |
||
243 | break; |
||
244 | case TASK_DLINESET: |
||
245 | res=j_write_dlineset(h,ptr); |
||
246 | break; |
||
247 | case TASK_WAIT: |
||
248 | case TASK_SIGNAL: |
||
249 | res=j_write_semaph(h,ptr); |
||
250 | break; |
||
251 | case TASK_NAME: |
||
252 | res=j_write_name(h,ptr); |
||
253 | break; |
||
254 | default: |
||
255 | return -1; |
||
256 | |||
257 | } |
||
258 | |||
259 | #ifdef DUMPOUT |
||
260 | printf(" \n"); |
||
261 | #endif |
||
262 | |||
263 | return res; |
||
264 | } |
||
265 | |||
266 | /* |
||
267 | * |
||
268 | * |
||
269 | * |
||
270 | */ |
||
271 | |||
272 | #define MAX_PROC 150 |
||
273 | |||
274 | //int activated[MAX_PROC]; |
||
275 | |||
276 | int cxx=0; |
||
277 | /* write MAXC-1 events */ |
||
278 | #define MAXC 10000 |
||
279 | |||
280 | long lasttime; |
||
281 | |||
282 | int sys_event(int h, void *param) |
||
283 | { |
||
284 | static int prevtask=-1; |
||
285 | trc_event_t *ptr=(trc_event_t *)param; |
||
286 | struct j_evt_task evt; |
||
287 | |||
288 | evt.p.time=ptr->time; |
||
289 | evt.task=ptr->x.sys.task; |
||
290 | |||
291 | lasttime=ptr->time; |
||
292 | switch(ptr->event) { |
||
293 | |||
294 | case TRC_CREATE: |
||
295 | return 0; |
||
296 | |||
297 | case TRC_ACTIVATE: |
||
298 | case TRC_INTACTIVATION: |
||
299 | |||
300 | |||
301 | //activated[ptr->x.sys.task]=1; |
||
302 | |||
303 | |||
304 | evt.p.type=TASK_ARRIVAL; |
||
305 | break; |
||
306 | |||
307 | case TRC_DESTROY: |
||
308 | |||
309 | |||
310 | //activated[ptr->x.sys.task]=0; |
||
311 | |||
312 | |||
313 | |||
314 | return 0; |
||
315 | |||
316 | case TRC_DISABLE: |
||
317 | |||
318 | return 0; |
||
319 | |||
320 | case TRC_DELAY: |
||
321 | prevtask=-1; |
||
322 | evt.p.type=TASK_DESCHEDULE; |
||
323 | break; |
||
324 | |||
325 | case TRC_SLEEP: |
||
326 | prevtask=-1; |
||
327 | evt.p.type=TASK_DESCHEDULE; |
||
328 | break; |
||
329 | |||
330 | case TRC_ENDCYCLE: |
||
331 | prevtask=-1; |
||
332 | evt.p.type=TASK_END; |
||
333 | break; |
||
334 | |||
335 | case TRC_SCHEDULE: |
||
336 | if (prevtask!=-1) { |
||
337 | struct j_evt_task evt2; |
||
338 | int res; |
||
339 | evt2.p.time=ptr->time; |
||
340 | evt2.p.type=TASK_DESCHEDULE; |
||
341 | evt2.task=prevtask; |
||
342 | res=writeEvent(h,&evt2); |
||
343 | if (res!=0) return -1; |
||
344 | } |
||
345 | |||
346 | /* |
||
347 | if (!activated[ptr->x.sys.task]) { |
||
348 | struct j_evt_task evt2; |
||
349 | |||
350 | evt2.p.time=ptr->time-1; |
||
351 | evt2.task=ptr->x.sys.task; |
||
352 | evt2.p.type=TASK_ARRIVAL; |
||
353 | |||
354 | writeEvent(h,&evt2); |
||
355 | |||
356 | activated[ptr->x.sys.task]=1; |
||
357 | } |
||
358 | */ |
||
359 | |||
360 | evt.p.type=TASK_SCHEDULE; |
||
361 | prevtask=ptr->x.sys.task; |
||
362 | break; |
||
363 | |||
364 | default: |
||
365 | return 0; |
||
366 | } |
||
367 | |||
368 | cxx++; |
||
369 | if (cxx==MAXC) return -1; |
||
370 | |||
371 | return writeEvent(h,&evt); |
||
372 | } |
||
373 | |||
374 | |||
375 | int sem_event(int h,void *param) |
||
376 | { |
||
377 | //trc_event_t *ptr=(trc_event_t *)param; |
||
378 | //struct j_evt_semaph evt; |
||
379 | |||
380 | return 0; |
||
381 | /* |
||
382 | evt.t.p.time=ptr->x.norm.when; |
||
383 | evt.t.task=ptr->x.norm.who; |
||
384 | switch(ptr->what) { |
||
385 | case TRC_SEM_WAIT: evt.t.p.type=TASK_WAIT; break; |
||
386 | case TRC_SEM_SIGNAL: evt.t.p.type=TASK_SIGNAL; break; |
||
387 | case TRC_SEM_WAITNB: return 0; |
||
388 | default: return 0; |
||
389 | } |
||
390 | evt.res=1; |
||
391 | evt.name="NoName"; |
||
392 | return j_write_semaph(h,&evt); |
||
393 | */ |
||
394 | } |
||
395 | |||
396 | /* -- */ |
||
397 | |||
398 | #define MAX_PROC 150 |
||
399 | int names[MAX_PROC]; |
||
400 | |||
401 | int outfile; |
||
402 | |||
403 | int dumpfunc(trc_event_t *ptr) |
||
404 | { |
||
405 | //printf("{%i}",ptr->event); |
||
406 | |||
407 | if (!names[ptr->x.sys.task]) { |
||
408 | struct j_evt_name evtname; |
||
409 | static char name[24]; |
||
410 | |||
411 | cxx++; |
||
412 | if (cxx==MAXC) return -1; |
||
413 | |||
414 | evtname.t.p.time=lasttime; |
||
415 | evtname.t.task=ptr->x.sys.task; |
||
416 | evtname.t.p.type=TASK_NAME; |
||
417 | sprintf(name,"task%03i",ptr->x.sys.task); |
||
418 | evtname.name=name; |
||
419 | writeEvent(outfile,&evtname); |
||
420 | names[ptr->x.sys.task]=1; |
||
421 | |||
422 | } |
||
423 | |||
424 | switch(event_class(ptr->event)) { |
||
425 | case TRC_CLASS_SYSTEM: |
||
426 | return sys_event(outfile,ptr); |
||
427 | case TRC_CLASS_SEM: |
||
428 | return 0; |
||
429 | return sem_event(outfile,ptr); |
||
430 | case TRC_CLASS_USER: |
||
431 | return 0; |
||
432 | } |
||
433 | return 0; |
||
434 | } |
||
435 | |||
436 | /* |
||
437 | * |
||
438 | */ |
||
439 | |||
440 | #ifndef O_BINARY |
||
441 | #define O_BINARY 0 |
||
442 | #endif |
||
443 | |||
444 | int main(int argc, char *argv[]) |
||
445 | { |
||
446 | int res; |
||
447 | int i; |
||
448 | |||
449 | if (argc!=3) { |
||
450 | fprintf(stderr,"missing filenames\n"); |
||
451 | fprintf(stderr,"usage: jdump SHARKtracefilename JTRACERtracefilename\n"); |
||
452 | return -1; |
||
453 | } |
||
454 | |||
455 | for (i=0;i<MAX_PROC;i++) { |
||
456 | names[i]=0; |
||
457 | //activated[i]=0; |
||
458 | } |
||
459 | |||
460 | outfile=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,0777); |
||
461 | if (outfile==-1) { |
||
462 | perror("can't open outfile"); |
||
463 | return -1; |
||
464 | } |
||
465 | res=read_trace(argv[1],dumpfunc); |
||
466 | close(outfile); |
||
467 | |||
468 | //fprintf(stderr,"result=%i",res); |
||
469 | return 0; |
||
470 | } |