From: Philippe Proulx Date: Wed, 6 Sep 2017 01:09:13 +0000 (-0400) Subject: lib/ctf-ir/utils.c: lazy-initialize the hash table of reserved keywords X-Git-Tag: v2.0.0-pre4~64 X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=commitdiff_plain;h=ca39df123b25151feb069e8cbf3be41e2239c5e8 lib/ctf-ir/utils.c: lazy-initialize the hash table of reserved keywords This fixes bugs in static build context on platforms where the calling order of library constructors is undefined: this constructor could be called before GLib's constructor, in which case you cannot call g_hash_table_new() because GLib's slice allocator is not initialized. Signed-off-by: Philippe Proulx Signed-off-by: Jérémie Galarneau --- diff --git a/lib/ctf-ir/utils.c b/lib/ctf-ir/utils.c index 0ab0df24..0b086529 100644 --- a/lib/ctf-ir/utils.c +++ b/lib/ctf-ir/utils.c @@ -29,7 +29,7 @@ #define BT_LOG_TAG "CTF-IR-UTILS" #include -#include +#include #include #include #include @@ -43,21 +43,21 @@ const char * const reserved_keywords_str[] = {"align", "callsite", static GHashTable *reserved_keywords_set; static int init_done; -static int global_data_refcount; -static __attribute__((constructor)) -void trace_init(void) +static +void try_init_reserved_keywords(void) { size_t i; const size_t reserved_keywords_count = sizeof(reserved_keywords_str) / sizeof(char *); - global_data_refcount++; - if (init_done) { + if (reserved_keywords_set) { return; } reserved_keywords_set = g_hash_table_new(g_direct_hash, g_direct_equal); + assert(reserved_keywords_set); + for (i = 0; i < reserved_keywords_count; i++) { gpointer quark = GINT_TO_POINTER(g_quark_from_string( reserved_keywords_str[i])); @@ -71,7 +71,7 @@ void trace_init(void) static __attribute__((destructor)) void trace_finalize(void) { - if (--global_data_refcount == 0) { + if (reserved_keywords_set) { g_hash_table_destroy(reserved_keywords_set); } } @@ -88,6 +88,8 @@ int bt_ctf_validate_identifier(const char *input_string) goto end; } + try_init_reserved_keywords(); + if (input_string[0] == '\0') { ret = -1; goto end;