ctf: factor out clk offset normalization
authorSimon Marchi <simon.marchi@efficios.com>
Tue, 23 Aug 2022 15:06:46 +0000 (11:06 -0400)
committerSimon Marchi <simon.marchi@efficios.com>
Tue, 23 Aug 2022 16:06:16 +0000 (12:06 -0400)
Change-Id: I5073a901f8c4c434ad35e102aaeb145a30055506
Signed-off-by: Simon Marchi <simon.marchi@efficios.com>
src/plugins/ctf/Makefile.am
src/plugins/ctf/common/metadata/ctf-ir.hpp
src/plugins/ctf/common/src/metadata/Makefile.am
src/plugins/ctf/common/src/metadata/normalize-clk-offset.cpp [new file with mode: 0644]
src/plugins/ctf/common/src/metadata/normalize-clk-offset.hpp [new file with mode: 0644]
src/plugins/ctf/common/src/metadata/tsdl/visitor-generate-ir.cpp

index 5e47a7cf096d81a3dfad5cdb97360626b8ff52d3..e9a5ba5e0b63c818da813d2c55d38cb39689539d 100644 (file)
@@ -21,7 +21,8 @@ babeltrace_plugin_ctf_la_LIBADD = \
        fs-sink/libbabeltrace2-plugin-ctf-fs-sink.la \
        fs-src/libbabeltrace2-plugin-ctf-fs-src.la \
        lttng-live/libbabeltrace2-plugin-ctf-lttng-live.la \
-       $(top_builddir)/src/plugins/common/param-validation/libbabeltrace2-param-validation.la
+       $(top_builddir)/src/plugins/common/param-validation/libbabeltrace2-param-validation.la \
+       $(top_builddir)/src/cpp-common/libcppcommon.la
 
 if !ENABLE_BUILT_IN_PLUGINS
 babeltrace_plugin_ctf_la_LIBADD += \
index 78e44010a511da212f4a4c2dfcba121f098fe0af..9b218be4034757ee40606055f296111b301cafd2 100644 (file)
@@ -3391,6 +3391,14 @@ public:
         return _mOffset;
     }
 
+    /*
+     * Sets offset from origin of instances of this clock class.
+     */
+    void offset(const ClkOffset& offset) noexcept
+    {
+        _mOffset = offset;
+    }
+
     /*
      * Whether or not the origin of instances of this clock class is the
      * Unix epoch.
index 577512195f58cb67fe4ebc441dc57d126e1ded01..4326278accd0a1e17662d592aee4e03170439c82 100644 (file)
@@ -4,7 +4,9 @@ SUBDIRS = tsdl json
 
 noinst_LTLIBRARIES = libctf-src-metadata.la
 
-libctf_src_metadata_la_SOURCES = ctf-ir.hpp ctf-ir.cpp
+libctf_src_metadata_la_SOURCES = \
+       ctf-ir.hpp ctf-ir.cpp \
+       normalize-clk-offset.hpp normalize-clk-offset.cpp
 
 libctf_src_metadata_la_LIBADD = \
        $(builddir)/tsdl/libctf-parser.la \
diff --git a/src/plugins/ctf/common/src/metadata/normalize-clk-offset.cpp b/src/plugins/ctf/common/src/metadata/normalize-clk-offset.cpp
new file mode 100644 (file)
index 0000000..8431404
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * SPDX-License-Identifier: MIT
+ *
+ * Copyright 2022 EfficiOS, Inc.
+ */
+
+#include "normalize-clk-offset.hpp"
+
+namespace ctf {
+namespace src {
+
+/*
+ * Normalize `clkCls`'s offsets so that the part in cycles is less than the
+ * frequency.
+ */
+void normalizeClkOffset(long long& offsetSec, unsigned long long& offsetCycles,
+                        unsigned long long freq) noexcept
+{
+    if (offsetCycles >= freq) {
+        const unsigned long long secInOffsetCycles = offsetCycles / freq;
+
+        offsetSec += (long long) secInOffsetCycles;
+        offsetCycles -= secInOffsetCycles * freq;
+    }
+}
+
+} /* namespace src */
+} /* namespace ctf */
diff --git a/src/plugins/ctf/common/src/metadata/normalize-clk-offset.hpp b/src/plugins/ctf/common/src/metadata/normalize-clk-offset.hpp
new file mode 100644 (file)
index 0000000..4b551d4
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * SPDX-License-Identifier: MIT
+ *
+ * Copyright 2022 EfficiOS, Inc.
+ */
+
+#ifndef _CTF_SRC_NORMALIZE_CLK_OFFSET_HPP
+#define _CTF_SRC_NORMALIZE_CLK_OFFSET_HPP
+
+#include "ctf-ir.hpp"
+
+namespace ctf {
+namespace src {
+
+/*
+ * Normalize `offsetSec` and `offsetCycles` such that the part in cycles is
+ * less than `freq`.
+ */
+void normalizeClkOffset(long long& offsetSec, unsigned long long& offsetCycles,
+                        unsigned long long freq) noexcept;
+
+} /* namespace src */
+} /* namespace ctf */
+
+#endif /* _CTF_SRC_NORMALIZE_CLK_OFFSET_HPP */
index f46e20747d58a989b3df88b8ef70694b3b526ebe..6eba2557f62a1d9664f86a6222fb8c30ee645ff1 100644 (file)
@@ -32,6 +32,7 @@
 #include "ctf-meta.hpp"
 #include "ctf-meta-visitors.hpp"
 #include "cpp-common/cfg-logging-error-reporting.hpp"
+#include "../normalize-clk-offset.hpp"
 
 /* Bit value (left shift) */
 #define _BV(_val) (1 << (_val))
@@ -4205,17 +4206,6 @@ static inline uint64_t cycles_from_ns(uint64_t frequency, uint64_t ns)
     return cycles;
 }
 
-static void calibrate_clock_class_offsets(int64_t *offset_seconds, uint64_t *offset_cycles,
-                                          uint64_t freq)
-{
-    if (*offset_cycles >= freq) {
-        const uint64_t s_in_offset_cycles = *offset_cycles / freq;
-
-        *offset_seconds += (int64_t) s_in_offset_cycles;
-        *offset_cycles -= (s_in_offset_cycles * freq);
-    }
-}
-
 static void apply_clock_class_is_absolute(struct ctf_visitor_generate_ir *ctx,
                                           struct ctf_clock_class *clock)
 {
@@ -4234,6 +4224,8 @@ static void apply_clock_class_offset(struct ctf_visitor_generate_ir *ctx,
     uint64_t offset_ns_to_apply;
     int64_t cur_offset_s;
     uint64_t cur_offset_cycles;
+    long long offsetSecLL;
+    unsigned long long offsetCyclesULL;
 
     if (ctx->decoder_config.clkClsCfg.offsetSec == 0 &&
         ctx->decoder_config.clkClsCfg.offsetNanoSec == 0) {
@@ -4273,11 +4265,13 @@ static void apply_clock_class_offset(struct ctf_visitor_generate_ir *ctx,
      * Recalibrate offsets because the part in cycles can be greater
      * than the frequency at this point.
      */
-    calibrate_clock_class_offsets(&cur_offset_s, &cur_offset_cycles, freq);
+    offsetSecLL = cur_offset_s;
+    offsetCyclesULL = cur_offset_cycles;
+    ctf::src::normalizeClkOffset(offsetSecLL, offsetCyclesULL, freq);
 
     /* Set final offsets */
-    clock->offset_seconds = cur_offset_s;
-    clock->offset_cycles = cur_offset_cycles;
+    clock->offset_seconds = offsetSecLL;
+    clock->offset_cycles = offsetCyclesULL;
 
 end:
     return;
@@ -4293,7 +4287,8 @@ static int visit_clock_decl(struct ctf_visitor_generate_ir *ctx, struct ctf_node
     const char *clock_class_name;
     int64_t offset_seconds = 0;
     uint64_t offset_cycles = 0;
-    uint64_t freq;
+    long long offsetSecLL;
+    unsigned long long offsetCyclesULL;
 
     if (clock_node->visited) {
         return 0;
@@ -4340,11 +4335,12 @@ static int visit_clock_decl(struct ctf_visitor_generate_ir *ctx, struct ctf_node
      * Adjust offsets so that the part in cycles is less than the
      * frequency (move to the part in seconds).
      */
-    freq = clock->frequency;
-    calibrate_clock_class_offsets(&offset_seconds, &offset_cycles, freq);
-    BT_ASSERT(offset_cycles < clock->frequency);
-    clock->offset_seconds = offset_seconds;
-    clock->offset_cycles = offset_cycles;
+    offsetSecLL = offset_seconds;
+    offsetCyclesULL = offset_cycles;
+    ctf::src::normalizeClkOffset(offsetSecLL, offsetCyclesULL, clock->frequency);
+    BT_ASSERT(offsetCyclesULL < clock->frequency);
+    clock->offset_seconds = offsetSecLL;
+    clock->offset_cycles = offsetCyclesULL;
     apply_clock_class_offset(ctx, clock);
     apply_clock_class_is_absolute(ctx, clock);
     g_ptr_array_add(ctx->ctf_tc->clock_classes, clock);
This page took 0.028454 seconds and 5 git commands to generate.