diff --git a/src/hb-common.cc b/src/hb-common.cc index 68c87116d..b0003408b 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 d3207b022..a0d5fe8e2 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 {