Add a shadow HT to query event classes by id
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 18 Nov 2016 23:08:11 +0000 (18:08 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Sat, 27 May 2017 18:09:07 +0000 (14:09 -0400)
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
formats/ctf/ir/stream-class.c
include/babeltrace/ctf-ir/stream-class-internal.h

index 4c59744e826bab3e1d15aff9f249c02e8515364f..d1cac621a8b022681534436e0196f7f151699978 100644 (file)
@@ -72,6 +72,9 @@ struct bt_ctf_stream_class *bt_ctf_stream_class_create(const char *name)
                goto error;
        }
 
+       stream_class->event_classes_ht = g_hash_table_new_full(g_int64_hash,
+                       g_int64_equal, g_free, NULL);
+
        ret = init_event_header(stream_class);
        if (ret) {
                goto error;
@@ -318,7 +321,7 @@ int bt_ctf_stream_class_add_event_class(
                struct bt_ctf_event_class *event_class)
 {
        int ret = 0;
-       int64_t event_id;
+       int64_t *event_id = NULL;
        struct bt_ctf_trace *trace = NULL;
        struct bt_ctf_stream_class *old_stream_class = NULL;
        struct bt_ctf_validation_output validation_output = { 0 };
@@ -336,6 +339,12 @@ int bt_ctf_stream_class_add_event_class(
                goto end;
        }
 
+       event_id = g_new(int64_t, 1);
+       if (!event_id) {
+               ret = -1;
+               goto end;
+       }
+
        /* Check for duplicate event classes */
        struct search_query query = { .value = event_class, .found = 0 };
        g_ptr_array_foreach(stream_class->event_classes, event_class_exists,
@@ -411,13 +420,14 @@ int bt_ctf_stream_class_add_event_class(
        }
 
        /* Only set an event ID if none was explicitly set before */
-       event_id = bt_ctf_event_class_get_id(event_class);
+       *event_id = bt_ctf_event_class_get_id(event_class);
        if (event_id < 0) {
                if (bt_ctf_event_class_set_id(event_class,
                        stream_class->next_event_id++)) {
                        ret = -1;
                        goto end;
                }
+               *event_id = stream_class->next_event_id;
        }
 
        ret = bt_ctf_event_class_set_stream_id(event_class, stream_class->id);
@@ -447,6 +457,9 @@ int bt_ctf_stream_class_add_event_class(
 
        /* Add to the event classes of the stream class */
        g_ptr_array_add(stream_class->event_classes, event_class);
+       g_hash_table_insert(stream_class->event_classes_ht, event_id,
+                       event_class);
+       event_id = NULL;
 
        /* Freeze the event class */
        bt_ctf_event_class_freeze(event_class);
@@ -480,6 +493,7 @@ end:
        assert(!stream_event_ctx_type);
        assert(!event_context_type);
        assert(!event_payload_type);
+       g_free(event_id);
 
        return ret;
 }
@@ -544,23 +558,16 @@ end:
 struct bt_ctf_event_class *bt_ctf_stream_class_get_event_class_by_id(
                struct bt_ctf_stream_class *stream_class, uint32_t id)
 {
-       size_t i;
+       int64_t id_key = id;
        struct bt_ctf_event_class *event_class = NULL;
 
        if (!stream_class) {
                goto end;
        }
 
-       for (i = 0; i < stream_class->event_classes->len; i++) {
-               struct bt_ctf_event_class *current_event_class =
-                       g_ptr_array_index(stream_class->event_classes, i);
-
-               if (bt_ctf_event_class_get_id(current_event_class) == id) {
-                       event_class = current_event_class;
-                       bt_get(event_class);
-                       goto end;
-               }
-       }
+       event_class = g_hash_table_lookup(stream_class->event_classes_ht,
+                       &id_key);
+       bt_get(event_class);
 end:
        return event_class;
 }
@@ -854,6 +861,9 @@ void bt_ctf_stream_class_destroy(struct bt_object *obj)
        stream_class = container_of(obj, struct bt_ctf_stream_class, base);
        bt_put(stream_class->clock);
 
+       if (stream_class->event_classes_ht) {
+               g_hash_table_destroy(stream_class->event_classes_ht);
+       }
        if (stream_class->event_classes) {
                g_ptr_array_free(stream_class->event_classes, TRUE);
        }
index 1bd1ea18c26bfb63c9711c38fa95aefaa5ea8208..db5b7c79dccdd5e314a016cd0972355d52dc975a 100644 (file)
@@ -42,6 +42,8 @@ struct bt_ctf_stream_class {
        GString *name;
        struct bt_ctf_clock *clock;
        GPtrArray *event_classes; /* Array of pointers to bt_ctf_event_class */
+       /* event class id (int64_t) to event class */
+       GHashTable *event_classes_ht;
        int id_set;
        uint32_t id;
        uint32_t next_event_id;
This page took 0.027618 seconds and 4 git commands to generate.