16487a117ff90b86bf7e3675e7d93762e3a480f6
1 /* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2003-2004 Michel Dagenais
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation;
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
23 #include <lttv/traceset.h>
24 #include <lttv/iattribute.h>
25 #include <lttv/state.h>
26 #include <lttv/hook.h>
28 #include <babeltrace/context.h>
29 #include <babeltrace/iterator.h>
30 #include <babeltrace/ctf/events.h>
31 /* A trace is a sequence of events gathered in the same tracing session. The
32 events may be stored in several tracefiles in the same directory.
33 A trace set is defined when several traces are to be analyzed together,
34 possibly to study the interactions between events in the different traces.
38 LttvTraceset
*lttv_traceset_new(void)
41 struct bt_iter_pos begin_pos
;
43 s
= g_new(LttvTraceset
, 1);
45 s
->traces
= g_ptr_array_new();
46 s
->context
= bt_context_create();
47 s
->a
= g_object_new(LTTV_ATTRIBUTE_TYPE
, NULL
);
48 //TODO remove this when we have really mecanism
49 //s->tmpState = g_new(LttvTraceState *, 1);
50 //lttv_trace_state_init(s->tmpState,0);
51 begin_pos
.type
= BT_SEEK_BEGIN
;
53 //s->iter = bt_ctf_iter_create(lttv_traceset_get_context(s),
57 s
->event_hooks
= lttv_hooks_new();
65 char * lttv_traceset_name(LttvTraceset
* s
)
71 LttvTrace
*lttv_trace_new(LttTrace
*t
)
75 new_trace
= g_new(LttvTrace
, 1);
76 new_trace
->a
= g_object_new(LTTV_ATTRIBUTE_TYPE
, NULL
);
78 new_trace
->ref_count
= 0;
84 * lttv_trace_create : Create a trace from a path
86 * ts is the traceset in which will be contained the trace
88 * path is the path where to find a trace. It is not recursive.
90 * This function is static since a trace should always be contained in a
93 * return the created trace or NULL on failure
95 static LttvTrace
*lttv_trace_create(LttvTraceset
*ts
, const char *path
)
97 int id
= bt_context_add_trace(lttv_traceset_get_context(ts
),
106 // Create the trace and save the trace handle id returned by babeltrace
107 LttvTrace
*new_trace
;
109 new_trace
= g_new(LttvTrace
, 1);
110 new_trace
->a
= g_object_new(LTTV_ATTRIBUTE_TYPE
, NULL
);
112 new_trace
->ref_count
= 0;
113 new_trace
->traceset
= ts
;
114 new_trace
->state
= g_new(LttvTraceState
,1);
115 lttv_trace_state_init(new_trace
->state
,new_trace
);
116 ts
->tmpState
= new_trace
->state
;
121 * lttv_trace_create : Create and add a single trace to a traceset
123 * ts is the traceset in which will be contained the trace
125 * path is the path where to find a trace. It is not recursive.
127 * return a positive integer (>=0)on success or -1 on failure
129 static int lttv_traceset_create_trace(LttvTraceset
*ts
, const char *path
)
131 LttvTrace
*trace
= lttv_trace_create(ts
, path
);
135 lttv_traceset_add(ts
, trace
);
139 LttvTraceset
*lttv_traceset_copy(LttvTraceset
*s_orig
)
145 s
= g_new(LttvTraceset
, 1);
147 s
->traces
= g_ptr_array_new();
148 for(i
=0;i
<s_orig
->traces
->len
;i
++)
150 trace
= g_ptr_array_index(s_orig
->traces
, i
);
153 /* WARNING: this is an alias, not a copy. */
154 g_ptr_array_add(s
->traces
, trace
);
156 s
->context
= s_orig
->context
;
157 bt_context_get(s
->context
);
158 s
->a
= LTTV_ATTRIBUTE(lttv_iattribute_deep_copy(LTTV_IATTRIBUTE(s_orig
->a
)));
163 LttvTraceset
*lttv_traceset_load(const gchar
*filename
)
165 LttvTraceset
*s
= g_new(LttvTraceset
,1);
168 s
->filename
= g_strdup(filename
);
169 tf
= fopen(filename
,"r");
171 g_critical("NOT IMPLEMENTED : load traceset data from a XML file");
177 gint
lttv_traceset_save(LttvTraceset
*s
)
181 tf
= fopen(s
->filename
, "w");
183 g_critical("NOT IMPLEMENTED : save traceset data in a XML file");
189 void lttv_traceset_destroy(LttvTraceset
*s
)
193 for(i
=0;i
<s
->traces
->len
;i
++) {
194 LttvTrace
*trace
= g_ptr_array_index(s
->traces
, i
);
195 lttv_trace_unref(trace
);
196 // todo mdenis 2012-03-27: uncomment when babeltrace gets fixed
197 //bt_context_remove_trace(lttv_traceset_get_context(s), trace->id);
198 if(lttv_trace_get_ref_number(trace
) == 0)
199 lttv_trace_destroy(trace
);
201 g_ptr_array_free(s
->traces
, TRUE
);
202 bt_context_put(s
->context
);
203 g_object_unref(s
->a
);
207 struct bt_context
*lttv_traceset_get_context(LttvTraceset
*s
)
212 LttvTraceset
*lttv_trace_get_traceset(LttvTrace
*trace
)
214 return trace
->traceset
;
217 LttvHooks
*lttv_traceset_get_hooks(LttvTraceset
*s
)
219 return s
->event_hooks
;
222 void lttv_trace_destroy(LttvTrace
*t
)
224 g_object_unref(t
->a
);
229 void lttv_traceset_add(LttvTraceset
*s
, LttvTrace
*t
)
232 g_ptr_array_add(s
->traces
, t
);
235 int lttv_traceset_add_path(LttvTraceset
*ts
, const char *trace_path
)
237 // todo mdenis 2012-03-27: add trace recursively and update comment
238 int ret
= lttv_traceset_create_trace(ts
, trace_path
);
242 unsigned lttv_traceset_number(LttvTraceset
*s
)
244 return s
->traces
->len
;
248 LttvTrace
*lttv_traceset_get(LttvTraceset
*s
, unsigned i
)
250 g_assert(s
->traces
->len
> i
);
251 return ((LttvTrace
*)s
->traces
->pdata
[i
]);
255 void lttv_traceset_remove(LttvTraceset
*s
, unsigned i
)
258 g_assert(s
->traces
->len
> i
);
259 t
= (LttvTrace
*)s
->traces
->pdata
[i
];
261 bt_context_remove_trace(lttv_traceset_get_context(s
), t
->id
);
262 g_ptr_array_remove_index(s
->traces
, i
);
266 /* A set of attributes is attached to each trace set, trace and tracefile
267 to store user defined data as needed. */
269 LttvAttribute
*lttv_traceset_attribute(LttvTraceset
*s
)
275 LttvAttribute
*lttv_trace_attribute(LttvTrace
*t
)
281 LttTrace
*lttv_trace(LttvTrace
*t
)
287 gint
lttv_trace_get_id(LttvTrace
*t
)
292 guint
lttv_trace_get_ref_number(LttvTrace
* t
)
294 // todo mdenis: adapt to babeltrace
298 guint
lttv_trace_ref(LttvTrace
* t
)
305 guint
lttv_trace_unref(LttvTrace
* t
)
307 if(likely(t
->ref_count
> 0))
313 guint
lttv_trace_get_num_cpu(LttvTrace
*t
)
315 #warning "TODO - Set the right number of CPU"
319 LttvTracesetPosition
*lttv_traceset_create_position(LttvTraceset
*traceset
)
325 void lttv_traceset_destroy_position(LttvTracesetPosition
*traceset_pos
)
331 void lttv_traceset_seek_to_position(LttvTracesetPosition
*traceset_pos
)
336 guint
lttv_traceset_get_cpuid_from_event(LttvEvent
*event
)
338 struct definition
*scope
;
339 unsigned long timestamp
;
342 struct bt_ctf_event
*ctf_event
= event
->bt_event
;
343 timestamp
= bt_ctf_get_timestamp(ctf_event
);
344 if (timestamp
== -1ULL) {
347 scope
= bt_ctf_get_top_level_scope(ctf_event
, BT_STREAM_PACKET_CONTEXT
);
348 if (bt_ctf_field_get_error()) {
351 cpu_id
= bt_ctf_get_uint64(bt_ctf_get_field(ctf_event
, scope
, "cpu_id"));
352 if (bt_ctf_field_get_error()) {
359 const char *lttv_traceset_get_name_from_event(LttvEvent
*event
)
361 return bt_ctf_event_name(event
->bt_event
);
This page took 0.0365 seconds and 4 git commands to generate.