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 | { | |
37 | ||
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 | ||
46 | } | |
47 | ||
48 | guint lttv_process_traceset_middle(LttvTraceset *traceset, | |
49 | LttTime end, | |
50 | gulong nb_events, | |
51 | const LttvTracesetPosition *end_position) | |
52 | { | |
53 | ||
54 | unsigned count = 0; | |
55 | ||
56 | struct bt_ctf_event *bt_event; | |
57 | ||
58 | LttvEvent event; | |
59 | struct bt_iter_pos begin_pos; | |
60 | ||
61 | begin_pos.type = BT_SEEK_BEGIN; | |
62 | ||
63 | if(!traceset->iter) { | |
64 | traceset->iter = bt_ctf_iter_create(lttv_traceset_get_context(traceset), | |
65 | &begin_pos, | |
66 | NULL); | |
67 | } | |
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 | ||
76 | count++; | |
77 | ||
78 | event.bt_event = bt_event; | |
79 | /* TODO ybrosseau 2012-04-01: use bt_ctf_get_trace_handle | |
80 | to retrieve the right state container */ | |
81 | event.state = traceset->tmpState; | |
82 | ||
83 | lttv_hooks_call(traceset->event_hooks, &event); | |
84 | ||
85 | if(bt_iter_next(bt_ctf_get_iter(traceset->iter)) < 0) { | |
86 | printf("ERROR NEXT\n"); | |
87 | break; | |
88 | } | |
89 | } else { | |
90 | /* READ FAILED */ | |
91 | ||
92 | break; | |
93 | ||
94 | } | |
95 | } | |
96 | ||
97 | ||
98 | ||
99 | return count; | |
100 | } | |
101 | ||
102 | void lttv_process_traceset_end(LttvTraceset *traceset, | |
103 | LttvHooks *after_traceset, | |
104 | LttvHooks *after_trace, | |
105 | LttvHooks *event) | |
106 | { | |
107 | /* Remove hooks from context. _after hooks are called by remove_hooks. */ | |
108 | /* It calls all after_traceset, after_trace, and after_tracefile hooks. */ | |
109 | lttv_traceset_remove_hooks(traceset, | |
110 | after_traceset, | |
111 | after_trace, | |
112 | event); | |
113 | ||
114 | } | |
115 | ||
116 | ||
117 | void lttv_traceset_add_hooks(LttvTraceset *traceset, | |
118 | LttvHooks *before_traceset, | |
119 | LttvHooks *before_trace, | |
120 | LttvHooks *event) | |
121 | { | |
122 | ||
123 | guint i, nb_trace; | |
124 | ||
125 | LttvTrace *trace; | |
126 | ||
127 | lttv_hooks_call(before_traceset, traceset); | |
128 | ||
129 | lttv_hooks_add_list(traceset->event_hooks, event); | |
130 | ||
131 | nb_trace = lttv_traceset_number(traceset); | |
132 | ||
133 | for(i = 0 ; i < nb_trace ; i++) { | |
134 | trace = (LttvTrace *)g_ptr_array_index(traceset->traces,i); | |
135 | lttv_trace_add_hooks(trace, | |
136 | before_trace, | |
137 | event | |
138 | ); | |
139 | } | |
140 | } | |
141 | void lttv_traceset_remove_hooks(LttvTraceset *traceset, | |
142 | LttvHooks *after_traceset, | |
143 | LttvHooks *after_trace, | |
144 | LttvHooks *event) | |
145 | { | |
146 | ||
147 | guint i, nb_trace; | |
148 | ||
149 | LttvTrace *trace; | |
150 | ||
151 | nb_trace = lttv_traceset_number(traceset); | |
152 | ||
153 | for(i = 0 ; i < nb_trace ; i++) { | |
154 | trace = (LttvTrace *)g_ptr_array_index(traceset->traces,i); | |
155 | lttv_trace_remove_hooks(trace, | |
156 | after_trace, | |
157 | event); | |
158 | ||
159 | } | |
160 | ||
161 | lttv_hooks_call(after_traceset, traceset); | |
162 | ||
163 | ||
164 | } | |
165 | ||
166 | ||
167 | void lttv_trace_add_hooks(LttvTrace *trace, | |
168 | LttvHooks *before_trace, | |
169 | LttvHooks *event) | |
170 | { | |
171 | lttv_hooks_call(before_trace, trace); | |
172 | } | |
173 | ||
174 | void lttv_trace_remove_hooks(LttvTrace *trace, | |
175 | LttvHooks *after_trace, | |
176 | LttvHooks *event) | |
177 | ||
178 | { | |
179 | lttv_hooks_call(after_trace, trace); | |
180 | ||
181 | } | |
182 | ||
183 | void lttv_process_traceset_seek_time(LttvTraceset *traceset, LttTime start) | |
184 | { | |
185 | #ifdef WAIT_FOR_BABELTRACE_FIX_SEEK_ZERO | |
186 | struct bt_iter_pos seekpos; | |
187 | int ret; | |
188 | seekpos.type = BT_SEEK_TIME; | |
189 | seekpos.u.seek_time = ltt_time_to_uint64(start); | |
190 | ret = bt_iter_set_pos(bt_ctf_get_iter(self->iter), &seekpos); | |
191 | if(ret < 0) { | |
192 | printf("Seek by time error: %s,\n",strerror(-ret)); | |
193 | } | |
194 | #else | |
195 | #warning Seek time disabled because of babeltrace bugs | |
196 | #endif | |
197 | ||
198 | } |