From 6c9a50c0105929edd0ddef958378e8714b854c46 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Mon, 17 Jun 2013 16:17:17 -0400 Subject: [PATCH] Compare traces by stream path as secondary key Ensure runs of babeltrace in different environments give the same output for the same trace collection. There are usually few events with the same timestamp in a trace, so this secondary key comparison should not be often required. Fixes #540 Signed-off-by: Mathieu Desnoyers --- lib/iterator.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/iterator.c b/lib/iterator.c index 4190e652..009fcd3f 100644 --- a/lib/iterator.c +++ b/lib/iterator.c @@ -73,16 +73,24 @@ static int stream_read_event(struct ctf_file_stream *sin) } /* - * returns true if a < b, false otherwise. + * Return true if a < b, false otherwise. + * If time stamps are exactly the same, compare by stream path. This + * ensures we get the same result between runs on the same trace + * collection on different environments. + * The result will be random for memory-mapped traces since there is no + * fixed path leading to those (they have empty path string). */ static int stream_compare(void *a, void *b) { struct ctf_file_stream *s_a = a, *s_b = b; - if (s_a->parent.real_timestamp < s_b->parent.real_timestamp) + if (s_a->parent.real_timestamp < s_b->parent.real_timestamp) { return 1; - else + } else if (likely(s_a->parent.real_timestamp > s_b->parent.real_timestamp)) { return 0; + } else { + return strcmp(s_a->parent.path, s_b->parent.path); + } } void bt_iter_free_pos(struct bt_iter_pos *iter_pos) -- 2.34.1