X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=lib%2Ftrace-ir%2Fclock-class.c;h=f21518e6c5061975516e2a27c8ab1ac50a067cd6;hb=0f2d58c93fe05b0f40c1c9589aa59d4f9cad877b;hp=d268ec3f560d15f9bb609ddaf10bc71eed59037b;hpb=140e6d943ff8f5657db28fbbe24ee8c98b7ca2f9;p=babeltrace.git diff --git a/lib/trace-ir/clock-class.c b/lib/trace-ir/clock-class.c index d268ec3f..f21518e6 100644 --- a/lib/trace-ir/clock-class.c +++ b/lib/trace-ir/clock-class.c @@ -1,8 +1,7 @@ /* + * 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 @@ -27,10 +26,11 @@ #include #include +#include +#include #include -#include +#include #include -#include #include #include #include @@ -50,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_private_clock_class *bt_private_clock_class_create(void) +struct bt_clock_class *bt_clock_class_create(bt_trace_class *trace_class) { int ret; struct bt_clock_class *clock_class = NULL; + BT_ASSERT_PRE_NON_NULL(trace_class, "Trace class"); BT_LOGD_STR("Creating default clock class object"); clock_class = g_new0(struct bt_clock_class, 1); @@ -131,13 +109,13 @@ struct bt_private_clock_class *bt_private_clock_class_create(void) clock_class->frequency = UINT64_C(1000000000); clock_class->is_absolute = 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; } @@ -149,43 +127,37 @@ error: BT_OBJECT_PUT_REF_AND_RESET(clock_class); end: - return (void *) clock_class; + 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_private_clock_class_set_name( - struct bt_private_clock_class *priv_clock_class, - const char *name) +enum bt_clock_class_status bt_clock_class_set_name( + struct bt_clock_class *clock_class, const char *name) { - struct bt_clock_class *clock_class = (void *) priv_clock_class; - BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); BT_ASSERT_PRE_NON_NULL(name, "Name"); BT_ASSERT_PRE_CLOCK_CLASS_HOT(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_private_clock_class_set_description( - struct bt_private_clock_class *priv_clock_class, - const char *descr) +enum bt_clock_class_status bt_clock_class_set_description( + struct bt_clock_class *clock_class, const char *descr) { - struct bt_clock_class *clock_class = (void *) priv_clock_class; - BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); BT_ASSERT_PRE_NON_NULL(descr, "Description"); BT_ASSERT_PRE_CLOCK_CLASS_HOT(clock_class); @@ -193,21 +165,18 @@ int bt_private_clock_class_set_description( 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; } -void bt_private_clock_class_set_frequency( - struct bt_private_clock_class *priv_clock_class, +void bt_clock_class_set_frequency(struct bt_clock_class *clock_class, uint64_t frequency) { - struct bt_clock_class *clock_class = (void *) priv_clock_class; - BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); BT_ASSERT_PRE_CLOCK_CLASS_HOT(clock_class); BT_ASSERT_PRE(frequency != UINT64_C(-1) && frequency != 0, @@ -221,18 +190,15 @@ void bt_private_clock_class_set_frequency( BT_LIB_LOGV("Set clock class's frequency: %!+K", clock_class); } -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; } -void bt_private_clock_class_set_precision( - struct bt_private_clock_class *priv_clock_class, +void bt_clock_class_set_precision(struct bt_clock_class *clock_class, uint64_t precision) { - struct bt_clock_class *clock_class = (void *) priv_clock_class; - BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); BT_ASSERT_PRE_CLOCK_CLASS_HOT(clock_class); BT_ASSERT_PRE(precision != UINT64_C(-1), @@ -242,7 +208,7 @@ void bt_private_clock_class_set_precision( BT_LIB_LOGV("Set clock class's precision: %!+K", clock_class); } -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"); @@ -252,12 +218,9 @@ void bt_clock_class_get_offset(struct bt_clock_class *clock_class, *cycles = clock_class->offset_cycles; } -void bt_private_clock_class_set_offset( - struct bt_private_clock_class *priv_clock_class, +void bt_clock_class_set_offset(struct bt_clock_class *clock_class, int64_t seconds, uint64_t cycles) { - struct bt_clock_class *clock_class = (void *) priv_clock_class; - BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); BT_ASSERT_PRE_CLOCK_CLASS_HOT(clock_class); BT_ASSERT_PRE(cycles < clock_class->frequency, @@ -269,18 +232,15 @@ void bt_private_clock_class_set_offset( BT_LIB_LOGV("Set clock class's offset: %!+K", clock_class); } -bt_bool bt_clock_class_is_absolute(struct bt_clock_class *clock_class) +bt_bool bt_clock_class_is_absolute(const struct bt_clock_class *clock_class) { BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); return (bool) clock_class->is_absolute; } -void bt_private_clock_class_set_is_absolute( - struct bt_private_clock_class *priv_clock_class, +void bt_clock_class_set_is_absolute(struct bt_clock_class *clock_class, bt_bool is_absolute) { - struct bt_clock_class *clock_class = (void *) priv_clock_class; - BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); BT_ASSERT_PRE_CLOCK_CLASS_HOT(clock_class); clock_class->is_absolute = (bool) is_absolute; @@ -288,18 +248,15 @@ void bt_private_clock_class_set_is_absolute( clock_class); } -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; } -void bt_private_clock_class_set_uuid( - struct bt_private_clock_class *priv_clock_class, +void bt_clock_class_set_uuid(struct bt_clock_class *clock_class, bt_uuid uuid) { - struct bt_clock_class *clock_class = (void *) priv_clock_class; - BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class"); BT_ASSERT_PRE_NON_NULL(uuid, "UUID"); BT_ASSERT_PRE_CLOCK_CLASS_HOT(clock_class); @@ -309,7 +266,7 @@ void bt_private_clock_class_set_uuid( } 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); @@ -318,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: " @@ -339,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); +}