X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=lib%2Ftrace-collection.c;h=035d2dc2d78a77a596e1b0fce2d6e8ccc86f6c3c;hp=c117874812bfebf28110ee8d9c3013ac16402831;hb=bb35f032b52330cfb17c144bfed81f2b1569f308;hpb=03798a93f959f6c694fe98f5647481947607c604 diff --git a/lib/trace-collection.c b/lib/trace-collection.c index c1178748..035d2dc2 100644 --- a/lib/trace-collection.c +++ b/lib/trace-collection.c @@ -16,6 +16,14 @@ * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. */ #include #include @@ -24,6 +32,7 @@ #include #include #include /* for clocks */ +#include #include @@ -38,24 +47,24 @@ static void check_clock_match(gpointer key, gpointer value, gpointer user_data) struct clock_match *match = user_data; struct ctf_clock *clock_a = value, *clock_b; - if (clock_a->uuid != 0) { + if (clock_a->absolute) { /* - * Lookup the the trace clocks into the collection - * clocks. + * Absolute time references, such as NTP, are looked up + * by clock name. */ clock_b = g_hash_table_lookup(match->clocks, - (gpointer) (unsigned long) clock_a->uuid); + (gpointer) (unsigned long) clock_a->name); if (clock_b) { match->clock_match = clock_b; return; } - } else if (clock_a->absolute) { + } else if (clock_a->uuid != 0) { /* - * Absolute time references, such as NTP, are looked up - * by clock name. + * Lookup the the trace clocks into the collection + * clocks. */ clock_b = g_hash_table_lookup(match->clocks, - (gpointer) (unsigned long) clock_a->name); + (gpointer) (unsigned long) clock_a->uuid); if (clock_b) { match->clock_match = clock_b; return; @@ -81,15 +90,15 @@ static void clock_add(gpointer key, gpointer value, gpointer user_data) (gpointer) (unsigned long) v); if (!tc_clock) { /* - * For now, we only support CTF that has one - * single clock uuid or name (absolute ref). + * For now we only support CTF that has one + * single clock uuid or name (absolute ref) per + * trace. */ if (g_hash_table_size(tc_clocks) > 0) { fprintf(stderr, "[error] Only CTF traces with a single clock description are supported by this babeltrace version.\n"); } if (!clock_match->tc->offset_nr) { - clock_match->tc->offset_first = - (t_clock->offset_s * 1000000000ULL) + t_clock->offset; + clock_match->tc->offset_first = clock_offset_ns(t_clock); clock_match->tc->delta_offset_first_sum = 0; clock_match->tc->offset_nr++; clock_match->tc->single_clock_offset_avg = @@ -98,34 +107,32 @@ static void clock_add(gpointer key, gpointer value, gpointer user_data) g_hash_table_insert(tc_clocks, (gpointer) (unsigned long) v, value); - } else { + } else if (!t_clock->absolute) { int64_t diff_ns; /* - * Check that the offsets match. If not, warn - * the user that we do an arbitrary choice. + * For non-absolute clocks, check that the + * offsets match. If not, warn the user that we + * do an arbitrary choice. */ - diff_ns = tc_clock->offset_s; - diff_ns -= t_clock->offset_s; - diff_ns *= 1000000000ULL; - diff_ns += tc_clock->offset; - diff_ns -= t_clock->offset; + diff_ns = clock_offset_ns(tc_clock) - clock_offset_ns(t_clock); printf_debug("Clock \"%s\" offset between traces has a delta of %" PRIu64 " ns.", g_quark_to_string(tc_clock->name), diff_ns < 0 ? -diff_ns : diff_ns); - if (diff_ns > 10000) { + if (diff_ns > 10000 || diff_ns < -10000) { fprintf(stderr, "[warning] Clock \"%s\" offset differs between traces (delta %" PRIu64 " ns). Using average.\n", g_quark_to_string(tc_clock->name), diff_ns < 0 ? -diff_ns : diff_ns); } /* Compute average */ clock_match->tc->delta_offset_first_sum += - (t_clock->offset_s * 1000000000ULL) + t_clock->offset - - clock_match->tc->offset_first; + clock_offset_ns(t_clock) - clock_match->tc->offset_first; clock_match->tc->offset_nr++; clock_match->tc->single_clock_offset_avg = clock_match->tc->offset_first + (clock_match->tc->delta_offset_first_sum / clock_match->tc->offset_nr); + /* Time need to use offset average */ + clock_match->tc->clock_use_offset_avg = 1; } } } @@ -135,13 +142,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 = container_of(td, struct ctf_trace, parent); + if (!tc || !trace) + return -EINVAL; - 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 = { @@ -163,6 +171,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, @@ -184,9 +195,12 @@ 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; + if (g_ptr_array_remove(tc->array, td)) { return 0; } else { @@ -195,8 +209,9 @@ int trace_collection_remove(struct trace_collection *tc, } -void init_trace_collection(struct trace_collection *tc) +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->single_clock_offset_avg = 0; @@ -206,11 +221,12 @@ 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); g_hash_table_destroy(tc->clocks); }