X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=lib%2Ftrace-ir%2Fclock-class.c;h=3c64ccd7e84fb9c413702601555a51ee06901b3d;hb=6d224992f91f8bb689b43cb745b9ca55007495bf;hp=c8e5f3fdbeee85a3a39840f26b5caadc3b428497;hpb=56e18c4ce186892c36d7f2cb5078087425e60134;p=babeltrace.git diff --git a/lib/trace-ir/clock-class.c b/lib/trace-ir/clock-class.c index c8e5f3fd..3c64ccd7 100644 --- a/lib/trace-ir/clock-class.c +++ b/lib/trace-ir/clock-class.c @@ -1,12 +1,7 @@ /* - * clock-class.c - * - * Babeltrace trace IR - Clock class - * + * Copyright 2017-2018 Philippe Proulx * Copyright 2013, 2014 Jérémie Galarneau * - * Author: Jérémie Galarneau - * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights @@ -31,10 +26,11 @@ #include #include +#include +#include #include -#include +#include #include -#include #include #include #include @@ -54,63 +50,41 @@ void destroy_clock_class(struct bt_object *obj) if (clock_class->name.str) { g_string_free(clock_class->name.str, TRUE); + clock_class->name.str = NULL; + clock_class->name.value = NULL; } if (clock_class->description.str) { g_string_free(clock_class->description.str, TRUE); + clock_class->description.str = NULL; + clock_class->description.value = NULL; } - bt_object_pool_finalize(&clock_class->cv_pool); + bt_object_pool_finalize(&clock_class->cs_pool); g_free(clock_class); } static -void free_clock_value(struct bt_clock_value *clock_value, +void free_clock_snapshot(struct bt_clock_snapshot *clock_snapshot, struct bt_clock_class *clock_class) { - bt_clock_value_destroy(clock_value); + bt_clock_snapshot_destroy(clock_snapshot); } static inline void set_base_offset(struct bt_clock_class *clock_class) { - uint64_t offset_cycles_ns; - - /* Initialize nanosecond timestamp to clock's offset in seconds */ - if (clock_class->offset_seconds <= (INT64_MIN / INT64_C(1000000000) - 1) || - clock_class->offset_seconds >= (INT64_MAX / INT64_C(1000000000)) - 1) { - /* - * Overflow: offset in seconds converted to nanoseconds - * is outside the int64_t range. We also subtract 1 here - * to leave "space" for the offset in cycles converted - * to nanoseconds (which is always less than 1 second by - * contract). - */ - clock_class->base_offset.overflows = true; - goto end; - } - - /* Offset (seconds) to nanoseconds */ - clock_class->base_offset.value_ns = clock_class->offset_seconds * - INT64_C(1000000000); - - /* Add offset in cycles */ - BT_ASSERT(clock_class->offset_cycles < clock_class->frequency); - offset_cycles_ns = bt_util_ns_from_value(clock_class->frequency, - clock_class->offset_cycles); - BT_ASSERT(offset_cycles_ns < 1000000000); - clock_class->base_offset.value_ns += (int64_t) offset_cycles_ns; - clock_class->base_offset.overflows = false; - -end: - return; + clock_class->base_offset.overflows = bt_util_get_base_offset_ns( + clock_class->offset_seconds, clock_class->offset_cycles, + clock_class->frequency, &clock_class->base_offset.value_ns); } -struct bt_clock_class *bt_clock_class_create(void) +struct bt_clock_class *bt_clock_class_create(bt_self_component *self_comp) { int ret; struct bt_clock_class *clock_class = NULL; + BT_ASSERT_PRE_NON_NULL(self_comp, "Self component"); BT_LOGD_STR("Creating default clock class object"); clock_class = g_new0(struct bt_clock_class, 1); @@ -133,15 +107,15 @@ struct bt_clock_class *bt_clock_class_create(void) } clock_class->frequency = UINT64_C(1000000000); - clock_class->is_absolute = BT_TRUE; + clock_class->origin_is_unix_epoch = BT_TRUE; set_base_offset(clock_class); - ret = bt_object_pool_initialize(&clock_class->cv_pool, - (bt_object_pool_new_object_func) bt_clock_value_new, + ret = bt_object_pool_initialize(&clock_class->cs_pool, + (bt_object_pool_new_object_func) bt_clock_snapshot_new, (bt_object_pool_destroy_object_func) - free_clock_value, + free_clock_snapshot, clock_class); if (ret) { - BT_LOGE("Failed to initialize clock value pool: ret=%d", + BT_LOGE("Failed to initialize clock snapshot pool: ret=%d", ret); goto error; } @@ -150,21 +124,20 @@ struct bt_clock_class *bt_clock_class_create(void) goto end; error: - BT_PUT(clock_class); + BT_OBJECT_PUT_REF_AND_RESET(clock_class); end: return clock_class; } -const char *bt_clock_class_get_name( - struct bt_clock_class *clock_class) +const char *bt_clock_class_get_name(const struct bt_clock_class *clock_class) { BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); return clock_class->name.value; } -int bt_clock_class_set_name(struct bt_clock_class *clock_class, - const char *name) +enum bt_clock_class_status bt_clock_class_set_name( + struct bt_clock_class *clock_class, const char *name) { BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); BT_ASSERT_PRE_NON_NULL(name, "Name"); @@ -172,17 +145,18 @@ int bt_clock_class_set_name(struct bt_clock_class *clock_class, g_string_assign(clock_class->name.str, name); clock_class->name.value = clock_class->name.str->str; BT_LIB_LOGV("Set clock class's name: %!+K", clock_class); - return 0; + return BT_CLOCK_CLASS_STATUS_OK; } -const char *bt_clock_class_get_description(struct bt_clock_class *clock_class) +const char *bt_clock_class_get_description( + const struct bt_clock_class *clock_class) { BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); return clock_class->description.value; } -int bt_clock_class_set_description(struct bt_clock_class *clock_class, - const char *descr) +enum bt_clock_class_status bt_clock_class_set_description( + struct bt_clock_class *clock_class, const char *descr) { BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); BT_ASSERT_PRE_NON_NULL(descr, "Description"); @@ -191,16 +165,16 @@ int bt_clock_class_set_description(struct bt_clock_class *clock_class, clock_class->description.value = clock_class->description.str->str; BT_LIB_LOGV("Set clock class's description: %!+K", clock_class); - return 0; + return BT_CLOCK_CLASS_STATUS_OK; } -uint64_t bt_clock_class_get_frequency(struct bt_clock_class *clock_class) +uint64_t bt_clock_class_get_frequency(const struct bt_clock_class *clock_class) { BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); return clock_class->frequency; } -int bt_clock_class_set_frequency(struct bt_clock_class *clock_class, +void bt_clock_class_set_frequency(struct bt_clock_class *clock_class, uint64_t frequency) { BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); @@ -214,16 +188,15 @@ int bt_clock_class_set_frequency(struct bt_clock_class *clock_class, clock_class->frequency = frequency; set_base_offset(clock_class); BT_LIB_LOGV("Set clock class's frequency: %!+K", clock_class); - return 0; } -uint64_t bt_clock_class_get_precision(struct bt_clock_class *clock_class) +uint64_t bt_clock_class_get_precision(const struct bt_clock_class *clock_class) { BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); return clock_class->precision; } -int bt_clock_class_set_precision(struct bt_clock_class *clock_class, +void bt_clock_class_set_precision(struct bt_clock_class *clock_class, uint64_t precision) { BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); @@ -233,10 +206,9 @@ int bt_clock_class_set_precision(struct bt_clock_class *clock_class, clock_class, precision); clock_class->precision = precision; BT_LIB_LOGV("Set clock class's precision: %!+K", clock_class); - return 0; } -void bt_clock_class_get_offset(struct bt_clock_class *clock_class, +void bt_clock_class_get_offset(const struct bt_clock_class *clock_class, int64_t *seconds, uint64_t *cycles) { BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); @@ -246,7 +218,7 @@ void bt_clock_class_get_offset(struct bt_clock_class *clock_class, *cycles = clock_class->offset_cycles; } -int bt_clock_class_set_offset(struct bt_clock_class *clock_class, +void bt_clock_class_set_offset(struct bt_clock_class *clock_class, int64_t seconds, uint64_t cycles) { BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); @@ -258,33 +230,31 @@ int bt_clock_class_set_offset(struct bt_clock_class *clock_class, clock_class->offset_cycles = cycles; set_base_offset(clock_class); BT_LIB_LOGV("Set clock class's offset: %!+K", clock_class); - return 0; } -bt_bool bt_clock_class_is_absolute(struct bt_clock_class *clock_class) +bt_bool bt_clock_class_origin_is_unix_epoch(const struct bt_clock_class *clock_class) { BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); - return (bool) clock_class->is_absolute; + return (bool) clock_class->origin_is_unix_epoch; } -int bt_clock_class_set_is_absolute(struct bt_clock_class *clock_class, - bt_bool is_absolute) +void bt_clock_class_set_origin_is_unix_epoch(struct bt_clock_class *clock_class, + bt_bool origin_is_unix_epoch) { BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); BT_ASSERT_PRE_CLOCK_CLASS_HOT(clock_class); - clock_class->is_absolute = (bool) is_absolute; - BT_LIB_LOGV("Set clock class's absolute property: %!+K", + clock_class->origin_is_unix_epoch = (bool) origin_is_unix_epoch; + BT_LIB_LOGV("Set clock class's origin is Unix epoch property: %!+K", clock_class); - return 0; } -bt_uuid bt_clock_class_get_uuid(struct bt_clock_class *clock_class) +bt_uuid bt_clock_class_get_uuid(const struct bt_clock_class *clock_class) { BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); return clock_class->uuid.value; } -int bt_clock_class_set_uuid(struct bt_clock_class *clock_class, +void bt_clock_class_set_uuid(struct bt_clock_class *clock_class, bt_uuid uuid) { BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); @@ -293,11 +263,10 @@ int bt_clock_class_set_uuid(struct bt_clock_class *clock_class, memcpy(clock_class->uuid.uuid, uuid, BABELTRACE_UUID_LEN); clock_class->uuid.value = clock_class->uuid.uuid; BT_LIB_LOGV("Set clock class's UUID: %!+K", clock_class); - return 0; } BT_HIDDEN -void _bt_clock_class_freeze(struct bt_clock_class *clock_class) +void _bt_clock_class_freeze(const struct bt_clock_class *clock_class) { BT_ASSERT(clock_class); @@ -306,18 +275,20 @@ void _bt_clock_class_freeze(struct bt_clock_class *clock_class) } BT_LIB_LOGD("Freezing clock class: %!+K", clock_class); - clock_class->frozen = 1; + ((struct bt_clock_class *) clock_class)->frozen = 1; } -int bt_clock_class_cycles_to_ns_from_origin(struct bt_clock_class *clock_class, +enum bt_clock_class_status bt_clock_class_cycles_to_ns_from_origin( + const struct bt_clock_class *clock_class, uint64_t cycles, int64_t *ns) { int ret; BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); BT_ASSERT_PRE_NON_NULL(ns, "Nanoseconds (output)"); - ret = bt_util_ns_from_origin(clock_class, cycles, ns); + ret = bt_util_ns_from_origin_clock_class(clock_class, cycles, ns); if (ret) { + ret = BT_CLOCK_CLASS_STATUS_OVERFLOW; BT_LIB_LOGW("Cannot convert cycles to nanoseconds " "from origin for given clock class: " "value overflows the signed 64-bit integer range: " @@ -327,3 +298,13 @@ int bt_clock_class_cycles_to_ns_from_origin(struct bt_clock_class *clock_class, return ret; } + +void bt_clock_class_get_ref(const struct bt_clock_class *clock_class) +{ + bt_object_get_ref(clock_class); +} + +void bt_clock_class_put_ref(const struct bt_clock_class *clock_class) +{ + bt_object_put_ref(clock_class); +}