Commit | Line | Data |
---|---|---|
7a4bdb54 YB |
1 | /* This file is part of the Linux Trace Toolkit viewer |
2 | * Copyright (C) 2003-2004 Michel Dagenais | |
3 | * Copyright (C) 2012 Yannick Brosseau | |
4 | * | |
5 | * This program is free software; you can redistribute it and/or modify | |
6 | * it under the terms of the GNU General Public License Version 2 as | |
7 | * published by the Free Software Foundation; | |
8 | * | |
9 | * This program is distributed in the hope that it will be useful, | |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | * GNU General Public License for more details. | |
13 | * | |
14 | * You should have received a copy of the GNU General Public License | |
15 | * along with this program; if not, write to the Free Software | |
16 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, | |
17 | * MA 02111-1307, USA. | |
18 | */ | |
19 | #ifdef HAVE_CONFIG_H | |
20 | #include <config.h> | |
21 | #endif | |
22 | ||
23 | #include <lttv/traceset-process.h> | |
24 | #include <lttv/traceset.h> | |
25 | #include <lttv/event.h> | |
26 | #include <babeltrace/context.h> | |
27 | #include <babeltrace/iterator.h> | |
28 | ||
29 | #include <babeltrace/ctf/events.h> | |
30 | #include <babeltrace/ctf/iterator.h> | |
31 | ||
32 | void lttv_process_traceset_begin(LttvTraceset *traceset, | |
33 | LttvHooks *before_traceset, | |
34 | LttvHooks *before_trace, | |
35 | LttvHooks *event) | |
36 | { | |
f1e5df2a | 37 | struct bt_iter_pos begin_pos; |
7a4bdb54 YB |
38 | /* simply add hooks in context. _before hooks are called by add_hooks. */ |
39 | /* It calls all before_traceset, before_trace, and before_tracefile hooks. */ | |
40 | lttv_traceset_add_hooks(traceset, | |
41 | before_traceset, | |
42 | before_trace, | |
43 | event); | |
44 | ||
45 | ||
f1e5df2a YB |
46 | |
47 | begin_pos.type = BT_SEEK_BEGIN; | |
48 | ||
49 | if(!traceset->iter) { | |
50 | traceset->iter = bt_ctf_iter_create(lttv_traceset_get_context(traceset), | |
51 | &begin_pos, | |
52 | NULL); | |
53 | } | |
7a4bdb54 YB |
54 | } |
55 | ||
56 | guint lttv_process_traceset_middle(LttvTraceset *traceset, | |
57 | LttTime end, | |
58 | gulong nb_events, | |
59 | const LttvTracesetPosition *end_position) | |
60 | { | |
61 | ||
62 | unsigned count = 0; | |
63 | ||
64 | struct bt_ctf_event *bt_event; | |
65 | ||
66 | LttvEvent event; | |
f1e5df2a | 67 | |
7a4bdb54 YB |
68 | while(TRUE) { |
69 | ||
70 | if((count >= nb_events) && (nb_events != G_MAXULONG)) { | |
71 | break; | |
72 | } | |
73 | ||
74 | if((bt_event = bt_ctf_iter_read_event(traceset->iter)) != NULL) { | |
75 | ||
2dd99ee2 YB |
76 | if(ltt_time_compare(end, ltt_time_from_uint64( bt_ctf_get_timestamp(bt_event))) <= 0) { |
77 | break; | |
78 | } | |
79 | ||
7a4bdb54 YB |
80 | count++; |
81 | ||
82 | event.bt_event = bt_event; | |
115c78c2 YB |
83 | |
84 | /* Retreive the associated state */ | |
85 | event.state = g_ptr_array_index(traceset->state_trace_handle_index, | |
86 | bt_ctf_event_get_handle_id(bt_event)); | |
7a4bdb54 YB |
87 | |
88 | lttv_hooks_call(traceset->event_hooks, &event); | |
89 | ||
90 | if(bt_iter_next(bt_ctf_get_iter(traceset->iter)) < 0) { | |
91 | printf("ERROR NEXT\n"); | |
92 | break; | |
93 | } | |
94 | } else { | |
95 | /* READ FAILED */ | |
96 | ||
97 | break; | |
98 | ||
99 | } | |
100 | } | |
101 | ||
102 | ||
103 | ||
104 | return count; | |
105 | } | |
106 | ||
107 | void lttv_process_traceset_end(LttvTraceset *traceset, | |
108 | LttvHooks *after_traceset, | |
109 | LttvHooks *after_trace, | |
110 | LttvHooks *event) | |
111 | { | |
112 | /* Remove hooks from context. _after hooks are called by remove_hooks. */ | |
113 | /* It calls all after_traceset, after_trace, and after_tracefile hooks. */ | |
114 | lttv_traceset_remove_hooks(traceset, | |
115 | after_traceset, | |
116 | after_trace, | |
117 | event); | |
118 | ||
119 | } | |
120 | ||
121 | ||
122 | void lttv_traceset_add_hooks(LttvTraceset *traceset, | |
123 | LttvHooks *before_traceset, | |
124 | LttvHooks *before_trace, | |
125 | LttvHooks *event) | |
126 | { | |
127 | ||
128 | guint i, nb_trace; | |
129 | ||
130 | LttvTrace *trace; | |
131 | ||
132 | lttv_hooks_call(before_traceset, traceset); | |
133 | ||
134 | lttv_hooks_add_list(traceset->event_hooks, event); | |
135 | ||
136 | nb_trace = lttv_traceset_number(traceset); | |
137 | ||
138 | for(i = 0 ; i < nb_trace ; i++) { | |
139 | trace = (LttvTrace *)g_ptr_array_index(traceset->traces,i); | |
140 | lttv_trace_add_hooks(trace, | |
141 | before_trace, | |
142 | event | |
143 | ); | |
144 | } | |
145 | } | |
146 | void lttv_traceset_remove_hooks(LttvTraceset *traceset, | |
147 | LttvHooks *after_traceset, | |
148 | LttvHooks *after_trace, | |
149 | LttvHooks *event) | |
150 | { | |
151 | ||
152 | guint i, nb_trace; | |
153 | ||
154 | LttvTrace *trace; | |
155 | ||
156 | nb_trace = lttv_traceset_number(traceset); | |
157 | ||
158 | for(i = 0 ; i < nb_trace ; i++) { | |
159 | trace = (LttvTrace *)g_ptr_array_index(traceset->traces,i); | |
160 | lttv_trace_remove_hooks(trace, | |
161 | after_trace, | |
162 | event); | |
163 | ||
164 | } | |
165 | ||
166 | lttv_hooks_call(after_traceset, traceset); | |
167 | ||
168 | ||
169 | } | |
170 | ||
171 | ||
172 | void lttv_trace_add_hooks(LttvTrace *trace, | |
173 | LttvHooks *before_trace, | |
174 | LttvHooks *event) | |
175 | { | |
176 | lttv_hooks_call(before_trace, trace); | |
177 | } | |
178 | ||
179 | void lttv_trace_remove_hooks(LttvTrace *trace, | |
180 | LttvHooks *after_trace, | |
181 | LttvHooks *event) | |
182 | ||
183 | { | |
184 | lttv_hooks_call(after_trace, trace); | |
185 | ||
186 | } | |
187 | ||
188 | void lttv_process_traceset_seek_time(LttvTraceset *traceset, LttTime start) | |
189 | { | |
7a4bdb54 YB |
190 | struct bt_iter_pos seekpos; |
191 | int ret; | |
f1e5df2a YB |
192 | if (traceset->iter == NULL) { |
193 | g_warning("Iterator not valid in seek_time"); | |
194 | return; | |
195 | } | |
7a4bdb54 YB |
196 | seekpos.type = BT_SEEK_TIME; |
197 | seekpos.u.seek_time = ltt_time_to_uint64(start); | |
f1e5df2a YB |
198 | |
199 | ret = bt_iter_set_pos(bt_ctf_get_iter(traceset->iter), &seekpos); | |
7a4bdb54 YB |
200 | if(ret < 0) { |
201 | printf("Seek by time error: %s,\n",strerror(-ret)); | |
202 | } | |
7a4bdb54 YB |
203 | |
204 | } |