Add check for endtime in process middle
[lttv.git] / lttv / lttv / traceset-process.c
CommitLineData
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
32void 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
56guint 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
107void 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
122void 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}
146void 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
172void lttv_trace_add_hooks(LttvTrace *trace,
173 LttvHooks *before_trace,
174 LttvHooks *event)
175{
176 lttv_hooks_call(before_trace, trace);
177}
178
179void 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
188void 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}
This page took 0.030374 seconds and 4 git commands to generate.