From 46df6828513d56cd60467e36cbe45aa06648f488 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 5 May 2011 15:33:19 -0400 Subject: [PATCH] Make user_data access threadsafe For now, by taking a global user_data mutex. --- src/hb-common.cc | 25 +++++++++++++++++++++++-- src/hb-object-private.hh | 2 -- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/hb-common.cc b/src/hb-common.cc index 68c8711..b000340 100644 --- a/src/hb-common.cc +++ b/src/hb-common.cc @@ -264,6 +264,14 @@ hb_script_get_horizontal_direction (hb_script_t script) /* hb_user_data_array_t */ + +/* NOTE: Currently we use a global lock for user_data access + * threadsafety. If one day we add a mutex to any object, we + * should switch to using that insted for these too. + */ + +static hb_static_mutex_t user_data_mutex; + bool hb_user_data_array_t::set (hb_user_data_key_t *key, void * data, @@ -271,19 +279,32 @@ hb_user_data_array_t::set (hb_user_data_key_t *key, { if (!key) return false; + + hb_mutex_lock (&user_data_mutex); + if (!data && !destroy) { items.remove (key); return true; } hb_user_data_item_t item = {key, data, destroy}; - return !!items.insert (item); + bool ret = !!items.insert (item); + + hb_mutex_unlock (&user_data_mutex); + + return ret; } void * hb_user_data_array_t::get (hb_user_data_key_t *key) { + hb_mutex_lock (&user_data_mutex); + hb_user_data_item_t *item = items.find (key); - return item ? item->data : NULL; + void *ret = item ? item->data : NULL; + + hb_mutex_unlock (&user_data_mutex); + + return ret; } diff --git a/src/hb-object-private.hh b/src/hb-object-private.hh index d3207b0..a0d5fe8 100644 --- a/src/hb-object-private.hh +++ b/src/hb-object-private.hh @@ -104,8 +104,6 @@ typedef struct { /* user_data */ -/* XXX make this thread-safe, somehow! */ - struct hb_user_data_array_t { struct hb_user_data_item_t { -- 2.7.4