Make user_data access threadsafe
authorBehdad Esfahbod <behdad@behdad.org>
Thu, 5 May 2011 19:33:19 +0000 (15:33 -0400)
committerBehdad Esfahbod <behdad@behdad.org>
Thu, 5 May 2011 19:33:19 +0000 (15:33 -0400)
For now, by taking a global user_data mutex.

src/hb-common.cc
src/hb-object-private.hh

index 68c8711..b000340 100644 (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;
 }
 
 
index d3207b0..a0d5fe8 100644 (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 {