Make user_data access threadsafe

For now, by taking a global user_data mutex.
This commit is contained in:
Behdad Esfahbod 2011-05-05 15:33:19 -04:00
parent 218e67b9ee
commit 46df682851
2 changed files with 23 additions and 4 deletions

View File

@ -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;
}

View File

@ -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 {