X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=lib%2Ftrace-collection.c;h=8e4a143213e8aca91fb77c2a8fac0b642ae87c34;hb=refs%2Fheads%2Fstable-1.5;hp=4f1379c5a43d73cb4e0bcae9053339bf533f7802;hpb=71dd417a2b700c2315ef9919104572df1bc83f7a;p=babeltrace.git diff --git a/lib/trace-collection.c b/lib/trace-collection.c index 4f1379c5..8e4a1432 100644 --- a/lib/trace-collection.c +++ b/lib/trace-collection.c @@ -72,24 +72,11 @@ static void check_clock_match(gpointer key, gpointer value, gpointer user_data) } } -/* - * Note: if using a frequency different from 1GHz for clock->offset, it - * is recommended to express the seconds in offset_s, otherwise there - * will be a loss of precision caused by the limited size of the double - * mantissa. - */ -static -uint64_t clock_offset_ns(struct ctf_clock *clock) -{ - return clock->offset_s * 1000000000ULL - + clock_cycles_to_ns(clock, clock->offset); -} - static void clock_add(gpointer key, gpointer value, gpointer user_data) { struct clock_match *clock_match = user_data; GHashTable *tc_clocks = clock_match->clocks; - struct ctf_clock *t_clock = value; + struct ctf_clock *t_clock = value, *clock_copy; GQuark v; if (t_clock->absolute) @@ -117,9 +104,14 @@ static void clock_add(gpointer key, gpointer value, gpointer user_data) clock_match->tc->single_clock_offset_avg = clock_match->tc->offset_first; } + clock_copy = g_new0(struct ctf_clock, 1); + *clock_copy = *t_clock; + if (t_clock->description) { + clock_copy->description = g_strdup(t_clock->description); + } g_hash_table_insert(tc_clocks, (gpointer) (unsigned long) v, - value); + clock_copy); } else if (!t_clock->absolute) { int64_t diff_ns; @@ -155,17 +147,14 @@ static void clock_add(gpointer key, gpointer value, gpointer user_data) * correlate this trace with at least one other clock in the trace and * convert the index from cycles to real time. */ -int trace_collection_add(struct trace_collection *tc, - struct trace_descriptor *td) +int bt_trace_collection_add(struct trace_collection *tc, + struct bt_trace_descriptor *trace) { - struct ctf_trace *trace; - - if (!tc || !td) + if (!tc || !trace) return -EINVAL; - trace = container_of(td, struct ctf_trace, parent); - g_ptr_array_add(tc->array, td); - trace->collection = tc; + if (!trace->clocks) + return 0; if (tc->array->len > 1) { struct clock_match clock_match = { @@ -187,6 +176,9 @@ int trace_collection_add(struct trace_collection *tc, } } + g_ptr_array_add(tc->array, trace); + trace->collection = tc; + { struct clock_match clock_match = { .clocks = tc->clocks, @@ -208,8 +200,8 @@ error: return -EPERM; } -int trace_collection_remove(struct trace_collection *tc, - struct trace_descriptor *td) +int bt_trace_collection_remove(struct trace_collection *tc, + struct bt_trace_descriptor *td) { if (!tc || !td) return -EINVAL; @@ -222,11 +214,21 @@ int trace_collection_remove(struct trace_collection *tc, } -void init_trace_collection(struct trace_collection *tc) +static +void clock_free(gpointer data) +{ + struct ctf_clock *clock = data; + + g_free(clock->description); + g_free(clock); +} + +void bt_init_trace_collection(struct trace_collection *tc) { assert(tc); tc->array = g_ptr_array_new(); - tc->clocks = g_hash_table_new(g_direct_hash, g_direct_equal); + tc->clocks = g_hash_table_new_full(g_direct_hash, g_direct_equal, + NULL, clock_free); tc->single_clock_offset_avg = 0; tc->offset_first = 0; tc->delta_offset_first_sum = 0; @@ -234,10 +236,10 @@ void init_trace_collection(struct trace_collection *tc) } /* - * finalize_trace_collection() closes the opened traces for read + * bt_finalize_trace_collection() closes the opened traces for read * and free the memory allocated for trace collection */ -void finalize_trace_collection(struct trace_collection *tc) +void bt_finalize_trace_collection(struct trace_collection *tc) { assert(tc); g_ptr_array_free(tc->array, TRUE);