Always evaluate BT_ASSERT(); add BT_ASSERT_DBG() for debug mode only
[babeltrace.git] / src / ctf-writer / clock.c
CommitLineData
ac0c6bdd
PP
1/*
2 * clock.c
3 *
086dc475 4 * Babeltrace CTF writer - Clock
ac0c6bdd
PP
5 *
6 * Copyright 2013, 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com>
7 * Copyright 2017 Philippe Proulx <pproulx@efficios.com>
8 *
9 * Author: Jérémie Galarneau <jeremie.galarneau@efficios.com>
10 *
11 * Permission is hereby granted, free of charge, to any person obtaining a copy
12 * of this software and associated documentation files (the "Software"), to deal
13 * in the Software without restriction, including without limitation the rights
14 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 * copies of the Software, and to permit persons to whom the Software is
16 * furnished to do so, subject to the following conditions:
17 *
18 * The above copyright notice and this permission notice shall be included in
19 * all copies or substantial portions of the Software.
20 *
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27 * SOFTWARE.
28 */
29
b03487ab 30#define BT_LOG_TAG "CTF-WRITER/CLOCK"
bf436657 31#include "logging.h"
8b45963b 32
57952005 33#include "common/assert.h"
d126826c 34#include "common/uuid.h"
57952005 35#include "compat/compiler.h"
3996bc53
PP
36#include <babeltrace2-ctf-writer/utils.h>
37#include <babeltrace2-ctf-writer/object.h>
ac0c6bdd
PP
38#include <inttypes.h>
39
57952005
MJ
40#include "clock-class.h"
41#include "clock.h"
42#include "object.h"
43#include "writer.h"
44
ac0c6bdd 45static
c2606e2f 46void bt_ctf_clock_destroy(struct bt_ctf_object *obj);
ac0c6bdd
PP
47
48struct bt_ctf_clock *bt_ctf_clock_create(const char *name)
49{
75c3fca1 50 int ret;
ac0c6bdd 51 struct bt_ctf_clock *clock = NULL;
d126826c 52 bt_uuid_t cc_uuid;
ac0c6bdd 53
bf436657 54 BT_CTF_ASSERT_PRE_NON_NULL(name, "Name");
ac0c6bdd 55 clock = g_new0(struct bt_ctf_clock, 1);
ac0c6bdd
PP
56 if (!clock) {
57 goto error;
58 }
59
c2606e2f 60 bt_ctf_object_init_shared(&clock->base, bt_ctf_clock_destroy);
ac0c6bdd 61 clock->value = 0;
15260cc8
PP
62
63 /* Pre-2.0.0 backward compatibility: default frequency is 1 GHz */
086dc475 64 clock->clock_class = (void *) bt_ctf_clock_class_create(name, 1000000000);
ac0c6bdd
PP
65 if (!clock->clock_class) {
66 goto error;
67 }
75c3fca1
PP
68
69 /* Automatically set clock class's UUID. */
d126826c 70 bt_uuid_generate(cc_uuid);
75c3fca1 71
086dc475 72 ret = bt_ctf_clock_class_set_uuid(clock->clock_class, cc_uuid);
ec4a3354 73 BT_ASSERT_DBG(ret == 0);
ac0c6bdd
PP
74 return clock;
75
76error:
c2606e2f 77 BT_CTF_OBJECT_PUT_REF_AND_RESET(clock);
ac0c6bdd
PP
78 return clock;
79}
80
81const char *bt_ctf_clock_get_name(struct bt_ctf_clock *clock)
82{
bf436657 83 BT_CTF_ASSERT_PRE_NON_NULL(clock, "CTF writer clock");
086dc475 84 return bt_ctf_clock_class_get_name(clock->clock_class);
ac0c6bdd
PP
85}
86
87const char *bt_ctf_clock_get_description(struct bt_ctf_clock *clock)
88{
bf436657 89 BT_CTF_ASSERT_PRE_NON_NULL(clock, "CTF writer clock");
086dc475 90 return bt_ctf_clock_class_get_description(clock->clock_class);
ac0c6bdd
PP
91}
92
93int bt_ctf_clock_set_description(struct bt_ctf_clock *clock, const char *desc)
94{
bf436657 95 BT_CTF_ASSERT_PRE_NON_NULL(clock, "CTF writer clock");
086dc475 96 return bt_ctf_clock_class_set_description(clock->clock_class,
8deee039 97 desc);
ac0c6bdd
PP
98}
99
100uint64_t bt_ctf_clock_get_frequency(struct bt_ctf_clock *clock)
101{
bf436657 102 BT_CTF_ASSERT_PRE_NON_NULL(clock, "CTF writer clock");
086dc475 103 return bt_ctf_clock_class_get_frequency(clock->clock_class);
ac0c6bdd
PP
104}
105
106int bt_ctf_clock_set_frequency(struct bt_ctf_clock *clock, uint64_t freq)
107{
bf436657 108 BT_CTF_ASSERT_PRE_NON_NULL(clock, "CTF writer clock");
086dc475 109 return bt_ctf_clock_class_set_frequency(clock->clock_class,
8deee039 110 freq);
ac0c6bdd
PP
111}
112
113uint64_t bt_ctf_clock_get_precision(struct bt_ctf_clock *clock)
114{
bf436657 115 BT_CTF_ASSERT_PRE_NON_NULL(clock, "CTF writer clock");
086dc475 116 return bt_ctf_clock_class_get_precision(clock->clock_class);
ac0c6bdd
PP
117}
118
119int bt_ctf_clock_set_precision(struct bt_ctf_clock *clock, uint64_t precision)
120{
bf436657 121 BT_CTF_ASSERT_PRE_NON_NULL(clock, "CTF writer clock");
086dc475 122 return bt_ctf_clock_class_set_precision(clock->clock_class,
8deee039 123 precision);
ac0c6bdd
PP
124}
125
126int bt_ctf_clock_get_offset_s(struct bt_ctf_clock *clock, int64_t *offset_s)
127{
bf436657 128 BT_CTF_ASSERT_PRE_NON_NULL(clock, "CTF writer clock");
086dc475 129 return bt_ctf_clock_class_get_offset_s(clock->clock_class,
8deee039 130 offset_s);
ac0c6bdd
PP
131}
132
133int bt_ctf_clock_set_offset_s(struct bt_ctf_clock *clock, int64_t offset_s)
134{
bf436657 135 BT_CTF_ASSERT_PRE_NON_NULL(clock, "CTF writer clock");
086dc475 136 return bt_ctf_clock_class_set_offset_s(clock->clock_class,
8deee039 137 offset_s);
ac0c6bdd
PP
138}
139
140int bt_ctf_clock_get_offset(struct bt_ctf_clock *clock, int64_t *offset)
141{
bf436657 142 BT_CTF_ASSERT_PRE_NON_NULL(clock, "CTF writer clock");
086dc475 143 return bt_ctf_clock_class_get_offset_cycles(clock->clock_class,
8deee039 144 offset);
ac0c6bdd
PP
145}
146
147int bt_ctf_clock_set_offset(struct bt_ctf_clock *clock, int64_t offset)
148{
bf436657 149 BT_CTF_ASSERT_PRE_NON_NULL(clock, "CTF writer clock");
086dc475 150 return bt_ctf_clock_class_set_offset_cycles(clock->clock_class,
8deee039 151 offset);
ac0c6bdd
PP
152}
153
154int bt_ctf_clock_get_is_absolute(struct bt_ctf_clock *clock)
155{
bf436657 156 BT_CTF_ASSERT_PRE_NON_NULL(clock, "CTF writer clock");
086dc475 157 return bt_ctf_clock_class_is_absolute(clock->clock_class);
ac0c6bdd
PP
158}
159
160int bt_ctf_clock_set_is_absolute(struct bt_ctf_clock *clock, int is_absolute)
161{
bf436657 162 BT_CTF_ASSERT_PRE_NON_NULL(clock, "CTF writer clock");
086dc475 163 return bt_ctf_clock_class_set_is_absolute(clock->clock_class,
8deee039 164 is_absolute);
ac0c6bdd
PP
165}
166
d126826c 167const uint8_t *bt_ctf_clock_get_uuid(struct bt_ctf_clock *clock)
ac0c6bdd 168{
bf436657 169 BT_CTF_ASSERT_PRE_NON_NULL(clock, "CTF writer clock");
086dc475 170 return bt_ctf_clock_class_get_uuid(clock->clock_class);
ac0c6bdd
PP
171}
172
d126826c 173int bt_ctf_clock_set_uuid(struct bt_ctf_clock *clock, const uint8_t *uuid)
ac0c6bdd 174{
bf436657 175 BT_CTF_ASSERT_PRE_NON_NULL(clock, "CTF writer clock");
086dc475 176 return bt_ctf_clock_class_set_uuid(clock->clock_class, uuid);
ac0c6bdd
PP
177}
178
179int bt_ctf_clock_set_time(struct bt_ctf_clock *clock, int64_t time)
180{
ac0c6bdd 181 int64_t value;
086dc475 182 struct bt_ctf_clock_class *cc;
ac0c6bdd 183
bf436657 184 BT_CTF_ASSERT_PRE_NON_NULL(clock, "CTF writer clock");
086dc475 185 cc = clock->clock_class;
ac0c6bdd
PP
186
187 /* Common case where cycles are actually nanoseconds */
8deee039 188 if (cc->frequency == 1000000000) {
ac0c6bdd
PP
189 value = time;
190 } else {
191 value = (uint64_t) (((double) time *
8deee039 192 (double) cc->frequency) / 1e9);
ac0c6bdd
PP
193 }
194
bf436657 195 BT_CTF_ASSERT_PRE(clock->value <= value,
8b45963b
PP
196 "CTF writer clock value must be updated monotonically: "
197 "prev-value=%" PRId64 ", new-value=%" PRId64,
198 clock->value, value);
ac0c6bdd 199 clock->value = value;
8b45963b 200 return 0;
ac0c6bdd
PP
201}
202
ac0c6bdd
PP
203BT_HIDDEN
204int bt_ctf_clock_get_value(struct bt_ctf_clock *clock, uint64_t *value)
205{
bf436657
MJ
206 BT_CTF_ASSERT_PRE_NON_NULL(clock, "CTF writer clock");
207 BT_CTF_ASSERT_PRE_NON_NULL(value, "Value");
ac0c6bdd 208 *value = clock->value;
8b45963b 209 return 0;
ac0c6bdd
PP
210}
211
212static
c2606e2f 213void bt_ctf_clock_destroy(struct bt_ctf_object *obj)
ac0c6bdd
PP
214{
215 struct bt_ctf_clock *clock;
216
217 clock = container_of(obj, struct bt_ctf_clock, base);
c2606e2f 218 bt_ctf_object_put_ref(clock->clock_class);
ac0c6bdd
PP
219 g_free(clock);
220}
8deee039
PP
221
222BT_HIDDEN
223void bt_ctf_clock_class_serialize(struct bt_ctf_clock_class *clock_class,
224 struct metadata_context *context)
225{
d126826c 226 uint8_t *uuid;
8deee039
PP
227
228 BT_LOGD("Serializing clock class's metadata: clock-class-addr=%p, "
229 "name=\"%s\", metadata-context-addr=%p", clock_class,
086dc475 230 bt_ctf_clock_class_get_name(clock_class),
8deee039
PP
231 context);
232
233 if (!clock_class || !context) {
234 BT_LOGW("Invalid parameter: clock class or metadata context is NULL: "
235 "clock-class-addr=%p, name=\"%s\", metadata-context-addr=%p",
236 clock_class,
086dc475 237 bt_ctf_clock_class_get_name(clock_class),
8deee039
PP
238 context);
239 return;
240 }
241
086dc475 242 uuid = clock_class->uuid;
8deee039
PP
243 g_string_append(context->string, "clock {\n");
244 g_string_append_printf(context->string, "\tname = %s;\n",
086dc475 245 clock_class->name->str);
8deee039 246
086dc475 247 if (clock_class->uuid_set) {
8deee039 248 g_string_append_printf(context->string,
d126826c
MJ
249 "\tuuid = \"" BT_UUID_FMT "\";\n",
250 BT_UUID_FMT_VALUES(uuid));
8deee039
PP
251 }
252
086dc475 253 if (clock_class->description) {
8deee039 254 g_string_append_printf(context->string, "\tdescription = \"%s\";\n",
086dc475 255 clock_class->description->str);
8deee039
PP
256 }
257
258 g_string_append_printf(context->string, "\tfreq = %" PRIu64 ";\n",
086dc475 259 clock_class->frequency);
8deee039 260 g_string_append_printf(context->string, "\tprecision = %" PRIu64 ";\n",
086dc475 261 clock_class->precision);
8deee039 262 g_string_append_printf(context->string, "\toffset_s = %" PRIu64 ";\n",
086dc475 263 clock_class->offset_s);
8deee039 264 g_string_append_printf(context->string, "\toffset = %" PRIu64 ";\n",
086dc475 265 clock_class->offset);
8deee039 266 g_string_append_printf(context->string, "\tabsolute = %s;\n",
086dc475 267 clock_class->absolute ? "true" : "false");
8deee039
PP
268 g_string_append(context->string, "};\n\n");
269}
This page took 0.060357 seconds and 4 git commands to generate.