| 1 | /* This module inserts a hook in the program main loop. This hook processes |
| 2 | all the events in the main tracefile. */ |
| 3 | |
| 4 | |
| 5 | #include <lttv/lttv.h> |
| 6 | #include <lttv/attribute.h> |
| 7 | #include <lttv/hook.h> |
| 8 | |
| 9 | static void process_trace_set(void *hook_data, void *call_data) |
| 10 | { |
| 11 | int i, nb; |
| 12 | lttv_attributes *a, *sa; |
| 13 | lttv_trace_set *s; |
| 14 | lttv_hooks *global_before, *before, *global_after, *after; |
| 15 | ltt_time start, end; |
| 16 | lttv_key *key; |
| 17 | lttv_hook f; |
| 18 | void *hook_data; |
| 19 | |
| 20 | a = lttv_global_attributes(); |
| 21 | global_before = (lttv_hooks *)lttv_attributes_get_pointer_pathname(a, |
| 22 | "hooks/trace_set/before"); |
| 23 | global_after = (lttv_hooks *)lttv_attributes_get_pointer_pathname(a, |
| 24 | "hooks/trace_set/after"); |
| 25 | s = (lttv_trace_set *)lttv_attributes_get_pointer_pathname(a, |
| 26 | "traceSet/main"); |
| 27 | |
| 28 | key = lttv_key_new_pathname("time/start"); |
| 29 | start = lttv_attributes_get_time(a,key); |
| 30 | lttv_key_destroy(key); |
| 31 | |
| 32 | key = lttv_key_new_pathname("time/end"); |
| 33 | end = lttv_attributes_get_time(a,key); |
| 34 | lttv_key_destroy(key); |
| 35 | |
| 36 | sa = lttv_trace_set_attributes(s); |
| 37 | |
| 38 | before = (lttv_hooks *)lttv_attributes_get_pointer_pathname(sa, |
| 39 | "hooks/before"); |
| 40 | if(before == NULL) { |
| 41 | before = lttv_hooks_new(); |
| 42 | lttv_attributes_set_pointer_pathname(sa, "hooks/before", before); |
| 43 | } |
| 44 | |
| 45 | after = (lttv_hooks *)lttv_attributes_get_pointer_pathname(sa, |
| 46 | "hooks/after"); |
| 47 | if(after == NULL) { |
| 48 | after = lttv_hooks_new(); |
| 49 | lttv_attributes_set_pointer_pathname(sa, "hooks/after", after); |
| 50 | } |
| 51 | |
| 52 | nb = lttv_hooks_number(global_before); |
| 53 | for(i = 0 ; i < nb ; i++) { |
| 54 | lttv_hooks_get(global_before, i, &f, &hook_data); |
| 55 | lttv_hooks_add(before, f, hook_data); |
| 56 | } |
| 57 | |
| 58 | nb = lttv_hooks_number(global_after); |
| 59 | for(i = 0 ; i < nb ; i++) { |
| 60 | lttv_hooks_get(global_after, i, &f, &hook_data); |
| 61 | lttv_hooks_add(after, f, hook_data); |
| 62 | } |
| 63 | |
| 64 | lttv_trace_set_process(s, before_trace_set, after_trace_set, filter, start, |
| 65 | end); |
| 66 | |
| 67 | nb = lttv_hooks_number(global_before); |
| 68 | for(i = 0 ; i < nb ; i++) { |
| 69 | lttv_hooks_get(global_before, i, &f, &hook_data); |
| 70 | lttv_hooks_remove(before, f, hook_data); |
| 71 | } |
| 72 | |
| 73 | nb = lttv_hooks_number(global_after); |
| 74 | for(i = 0 ; i < nb ; i++) { |
| 75 | lttv_hooks_get(global_after, i, &f, &hook_data); |
| 76 | lttv_hooks_remove(after, f, hook_data); |
| 77 | } |
| 78 | } |
| 79 | |
| 80 | |
| 81 | void init(int argc, char **argv) |
| 82 | { |
| 83 | lttv_attributes *a; |
| 84 | lttv_hooks *h; |
| 85 | |
| 86 | a = lttv_global_attributes(); |
| 87 | h = (lttv_hooks *)lttv_attributes_get_pointer_pathname(a,"hooks/main"); |
| 88 | lttv_hooks_add(h, process_trace_set, NULL); |
| 89 | } |
| 90 | |
| 91 | |
| 92 | void destroy() |
| 93 | { |
| 94 | lttv_attributes *a; |
| 95 | lttv_hooks *h; |
| 96 | |
| 97 | a = lttv_global_attributes(); |
| 98 | h = (lttv_hooks *)lttv_attributes_get_pointer_pathname(a,"hooks/main"); |
| 99 | lttv_hooks_remove(h, process_trace_set, NULL); |
| 100 | } |
| 101 | |
| 102 | |
| 103 | |
| 104 | |