ir: clock: use value in cycles instead of ns
[babeltrace.git] / formats / ctf / ir / clock.c
CommitLineData
273b65be
JG
1/*
2 * clock.c
3 *
d2dc44b6 4 * Babeltrace CTF IR - Clock
273b65be 5 *
de9dd397 6 * Copyright 2013, 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com>
273b65be
JG
7 *
8 * Author: Jérémie Galarneau <jeremie.galarneau@efficios.com>
9 *
10 * Permission is hereby granted, free of charge, to any person obtaining a copy
11 * of this software and associated documentation files (the "Software"), to deal
12 * in the Software without restriction, including without limitation the rights
13 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 * copies of the Software, and to permit persons to whom the Software is
15 * furnished to do so, subject to the following conditions:
16 *
17 * The above copyright notice and this permission notice shall be included in
18 * all copies or substantial portions of the Software.
19 *
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26 * SOFTWARE.
27 */
28
adc315b8 29#include <babeltrace/ctf-ir/clock-internal.h>
654c1444 30#include <babeltrace/ctf-ir/utils.h>
83509119 31#include <babeltrace/ref.h>
273b65be 32#include <babeltrace/ctf-writer/writer-internal.h>
83509119 33#include <babeltrace/object-internal.h>
273b65be
JG
34#include <babeltrace/compiler.h>
35#include <inttypes.h>
36
37static
83509119 38void bt_ctf_clock_destroy(struct bt_object *obj);
273b65be 39
4c426c17
JG
40BT_HIDDEN
41struct bt_ctf_clock *_bt_ctf_clock_create(void)
273b65be 42{
4c426c17
JG
43 struct bt_ctf_clock *clock = g_new0(
44 struct bt_ctf_clock, 1);
45
46 if (!clock) {
47 goto end;
48 }
49
50 clock->precision = 1;
51 clock->frequency = 1000000000;
83509119 52 bt_object_init(clock, bt_ctf_clock_destroy);
4c426c17
JG
53end:
54 return clock;
55}
56
57BT_HIDDEN
58int bt_ctf_clock_set_name(struct bt_ctf_clock *clock,
59 const char *name)
60{
61 int ret = 0;
273b65be 62
654c1444 63 if (bt_ctf_validate_identifier(name)) {
4c426c17
JG
64 ret = -1;
65 goto end;
273b65be
JG
66 }
67
4c426c17 68 if (clock->name) {
e1ae7645
JG
69 g_string_assign(clock->name, name);
70 } else {
71 clock->name = g_string_new(name);
72 if (!clock->name) {
73 ret = -1;
74 goto end;
75 }
273b65be
JG
76 }
77
4c426c17
JG
78end:
79 return ret;
80}
81
82struct bt_ctf_clock *bt_ctf_clock_create(const char *name)
83{
84 int ret;
85 struct bt_ctf_clock *clock = NULL;
86
87 clock = _bt_ctf_clock_create();
88 if (!clock) {
89 goto error;
90 }
91
92 ret = bt_ctf_clock_set_name(clock, name);
93 if (ret) {
83509119 94 goto error;
273b65be
JG
95 }
96
19dd40db 97 ret = bt_uuid_generate(clock->uuid);
be018f15 98 if (ret) {
83509119 99 goto error;
be018f15
JG
100 }
101
102 clock->uuid_set = 1;
273b65be 103 return clock;
273b65be 104error:
83509119
JG
105 BT_PUT(clock);
106 return clock;
87d76bb1
JG
107}
108
109const char *bt_ctf_clock_get_name(struct bt_ctf_clock *clock)
110{
111 const char *ret = NULL;
112
113 if (!clock) {
114 goto end;
115 }
116
117 if (clock->name) {
118 ret = clock->name->str;
119 }
120
121end:
122 return ret;
123}
124
125const char *bt_ctf_clock_get_description(struct bt_ctf_clock *clock)
126{
127 const char *ret = NULL;
128
129 if (!clock) {
130 goto end;
131 }
132
133 if (clock->description) {
134 ret = clock->description->str;
135 }
136end:
137 return ret;
273b65be
JG
138}
139
140int bt_ctf_clock_set_description(struct bt_ctf_clock *clock, const char *desc)
141{
142 int ret = 0;
143
144 if (!clock || !desc || clock->frozen) {
145 ret = -1;
146 goto end;
147 }
148
87d76bb1 149 clock->description = g_string_new(desc);
273b65be
JG
150 ret = clock->description ? 0 : -1;
151end:
152 return ret;
153}
154
87d76bb1
JG
155uint64_t bt_ctf_clock_get_frequency(struct bt_ctf_clock *clock)
156{
157 uint64_t ret = -1ULL;
158
159 if (!clock) {
160 goto end;
161 }
162
163 ret = clock->frequency;
164end:
165 return ret;
166}
167
273b65be
JG
168int bt_ctf_clock_set_frequency(struct bt_ctf_clock *clock, uint64_t freq)
169{
170 int ret = 0;
171
172 if (!clock || clock->frozen) {
173 ret = -1;
174 goto end;
175 }
176
177 clock->frequency = freq;
178end:
179 return ret;
180}
181
87d76bb1
JG
182uint64_t bt_ctf_clock_get_precision(struct bt_ctf_clock *clock)
183{
184 uint64_t ret = -1ULL;
185
186 if (!clock) {
187 goto end;
188 }
189
190 ret = clock->precision;
191end:
192 return ret;
193}
194
273b65be
JG
195int bt_ctf_clock_set_precision(struct bt_ctf_clock *clock, uint64_t precision)
196{
197 int ret = 0;
198
199 if (!clock || clock->frozen) {
200 ret = -1;
201 goto end;
202 }
203
204 clock->precision = precision;
205end:
206 return ret;
207}
208
61cf588b 209int bt_ctf_clock_get_offset_s(struct bt_ctf_clock *clock, int64_t *offset_s)
87d76bb1 210{
61cf588b 211 int ret = 0;
87d76bb1 212
61cf588b
MD
213 if (!clock || !offset_s) {
214 ret = -1;
87d76bb1
JG
215 goto end;
216 }
217
61cf588b 218 *offset_s = clock->offset_s;
87d76bb1
JG
219end:
220 return ret;
221}
222
61cf588b 223int bt_ctf_clock_set_offset_s(struct bt_ctf_clock *clock, int64_t offset_s)
273b65be
JG
224{
225 int ret = 0;
226
227 if (!clock || clock->frozen) {
228 ret = -1;
229 goto end;
230 }
231
232 clock->offset_s = offset_s;
233end:
234 return ret;
235}
236
61cf588b 237int bt_ctf_clock_get_offset(struct bt_ctf_clock *clock, int64_t *offset)
87d76bb1 238{
61cf588b 239 int ret = 0;
87d76bb1 240
61cf588b
MD
241 if (!clock || !offset) {
242 ret = -1;
87d76bb1
JG
243 goto end;
244 }
245
61cf588b 246 *offset = clock->offset;
87d76bb1
JG
247end:
248 return ret;
249}
250
61cf588b 251int bt_ctf_clock_set_offset(struct bt_ctf_clock *clock, int64_t offset)
273b65be
JG
252{
253 int ret = 0;
254
255 if (!clock || clock->frozen) {
256 ret = -1;
257 goto end;
258 }
259
260 clock->offset = offset;
261end:
262 return ret;
263}
264
87d76bb1
JG
265int bt_ctf_clock_get_is_absolute(struct bt_ctf_clock *clock)
266{
267 int ret = -1;
268
269 if (!clock) {
270 goto end;
271 }
272
273 ret = clock->absolute;
274end:
275 return ret;
276}
277
273b65be
JG
278int bt_ctf_clock_set_is_absolute(struct bt_ctf_clock *clock, int is_absolute)
279{
280 int ret = 0;
281
282 if (!clock || clock->frozen) {
283 ret = -1;
284 goto end;
285 }
286
287 clock->absolute = !!is_absolute;
288end:
289 return ret;
290}
291
85b743f4
JG
292const unsigned char *bt_ctf_clock_get_uuid(struct bt_ctf_clock *clock)
293{
294 const unsigned char *ret;
295
be018f15 296 if (!clock || !clock->uuid_set) {
85b743f4
JG
297 ret = NULL;
298 goto end;
299 }
300
301 ret = clock->uuid;
302end:
303 return ret;
304}
305
306int bt_ctf_clock_set_uuid(struct bt_ctf_clock *clock, const unsigned char *uuid)
307{
308 int ret = 0;
309
be018f15 310 if (!clock || !uuid || clock->frozen) {
85b743f4
JG
311 ret = -1;
312 goto end;
313 }
314
315 memcpy(clock->uuid, uuid, sizeof(uuid_t));
be018f15 316 clock->uuid_set = 1;
85b743f4
JG
317end:
318 return ret;
319}
320
61cf588b 321int bt_ctf_clock_get_time(struct bt_ctf_clock *clock, int64_t *time)
87d76bb1 322{
61cf588b 323 int ret = 0;
87d76bb1 324
61cf588b
MD
325 if (!clock || !time) {
326 ret = -1;
87d76bb1
JG
327 goto end;
328 }
329
e1e30a8c
PP
330 /* Common case where cycles are actually nanoseconds */
331 if (clock->frequency == 1000000000) {
332 *time = (int64_t) clock->value;
333 } else {
334 *time = (int64_t) ((1e9 * (double) clock->value) /
335 (double) clock->frequency);
336 }
337
87d76bb1
JG
338end:
339 return ret;
340}
341
61cf588b 342int bt_ctf_clock_set_time(struct bt_ctf_clock *clock, int64_t time)
273b65be
JG
343{
344 int ret = 0;
345
346 /* Timestamps are strictly monotonic */
e1e30a8c
PP
347 if (!clock) {
348 ret = -1;
349 goto end;
350 }
351
352 /* Common case where cycles are actually nanoseconds */
353 if (clock->frequency == 1000000000) {
354 clock->value = time;
355 goto end;
356 }
357
358 ret = bt_ctf_clock_set_value(clock,
359 (uint64_t) (((double) time * (double) clock->frequency) / 1e9));
360
361end:
362 return ret;
363}
364
365uint64_t bt_ctf_clock_get_value(struct bt_ctf_clock *clock)
366{
367 uint64_t ret = -1ULL;
368
369 if (!clock) {
370 goto end;
371 }
372
373 ret = clock->value;
374end:
375 return ret;
376}
377
378int bt_ctf_clock_set_value(struct bt_ctf_clock *clock, uint64_t value)
379{
380 int ret = 0;
381
382 /* Timestamps are strictly monotonic */
383 if (!clock || value < clock->value) {
273b65be
JG
384 ret = -1;
385 goto end;
386 }
387
e1e30a8c 388 clock->value = value;
273b65be
JG
389end:
390 return ret;
391}
392
393void bt_ctf_clock_get(struct bt_ctf_clock *clock)
394{
83509119 395 bt_get(clock);
273b65be
JG
396}
397
398void bt_ctf_clock_put(struct bt_ctf_clock *clock)
399{
83509119 400 bt_put(clock);
273b65be
JG
401}
402
403BT_HIDDEN
404void bt_ctf_clock_freeze(struct bt_ctf_clock *clock)
405{
406 if (!clock) {
407 return;
408 }
409
410 clock->frozen = 1;
411}
412
413BT_HIDDEN
414void bt_ctf_clock_serialize(struct bt_ctf_clock *clock,
415 struct metadata_context *context)
416{
417 unsigned char *uuid;
418
419 if (!clock || !context) {
420 return;
421 }
422
423 uuid = clock->uuid;
424 g_string_append(context->string, "clock {\n");
425 g_string_append_printf(context->string, "\tname = %s;\n",
426 clock->name->str);
427 g_string_append_printf(context->string,
428 "\tuuid = \"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\";\n",
429 uuid[0], uuid[1], uuid[2], uuid[3],
430 uuid[4], uuid[5], uuid[6], uuid[7],
431 uuid[8], uuid[9], uuid[10], uuid[11],
432 uuid[12], uuid[13], uuid[14], uuid[15]);
7a69f348 433 if (clock->description) {
273b65be
JG
434 g_string_append_printf(context->string, "\tdescription = \"%s\";\n",
435 clock->description->str);
436 }
437
438 g_string_append_printf(context->string, "\tfreq = %" PRIu64 ";\n",
439 clock->frequency);
440 g_string_append_printf(context->string, "\tprecision = %" PRIu64 ";\n",
441 clock->precision);
442 g_string_append_printf(context->string, "\toffset_s = %" PRIu64 ";\n",
443 clock->offset_s);
444 g_string_append_printf(context->string, "\toffset = %" PRIu64 ";\n",
445 clock->offset);
446 g_string_append_printf(context->string, "\tabsolute = %s;\n",
447 clock->absolute ? "TRUE" : "FALSE");
448 g_string_append(context->string, "};\n\n");
449}
450
273b65be 451static
83509119 452void bt_ctf_clock_destroy(struct bt_object *obj)
273b65be
JG
453{
454 struct bt_ctf_clock *clock;
273b65be 455
83509119 456 clock = container_of(obj, struct bt_ctf_clock, base);
273b65be
JG
457 if (clock->name) {
458 g_string_free(clock->name, TRUE);
459 }
460
461 if (clock->description) {
462 g_string_free(clock->description, TRUE);
463 }
464
465 g_free(clock);
466}
This page took 0.046555 seconds and 4 git commands to generate.