bootstrap: Standardize on autoreconf -vi
[babeltrace.git] / lib / trace-collection.c
index 1c78f280fe0bcb128d3da85dbdfdf5a0e5daa6b4..035d2dc2d78a77a596e1b0fce2d6e8ccc86f6c3c 100644 (file)
  *
  * 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 <babeltrace/babeltrace.h>
 #include <babeltrace/format.h>
@@ -39,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;
@@ -64,19 +72,6 @@ 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;
@@ -95,8 +90,9 @@ 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");
@@ -111,12 +107,13 @@ 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 = clock_offset_ns(tc_clock) - clock_offset_ns(t_clock);
                        printf_debug("Clock \"%s\" offset between traces has a delta of %" PRIu64 " ns.",
@@ -134,6 +131,8 @@ static void clock_add(gpointer key, gpointer value, gpointer user_data)
                        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;
                }
        }
 }
@@ -143,17 +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;
-
-       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 = {
@@ -175,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,
@@ -196,8 +195,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;
@@ -210,7 +209,7 @@ 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();
@@ -222,10 +221,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);
This page took 0.027274 seconds and 4 git commands to generate.