[daemon-fix] Fixed sending daemon match rules for kdbus broadcasts
[platform/upstream/dbus.git] / dbus / dbus-dataslot.c
index 8fab7bb..e37c9dd 100644 (file)
@@ -20,6 +20,8 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  *
  */
+
+#include <config.h>
 #include "dbus-dataslot.h"
 #include "dbus-threads-internal.h"
 
  * @param allocator the allocator to initialize
  */
 dbus_bool_t
-_dbus_data_slot_allocator_init (DBusDataSlotAllocator *allocator)
+_dbus_data_slot_allocator_init (DBusDataSlotAllocator *allocator,
+                                DBusGlobalLock         lock)
 {
   allocator->allocated_slots = NULL;
   allocator->n_allocated_slots = 0;
   allocator->n_used_slots = 0;
-  allocator->lock_loc = NULL;
-  
+  allocator->lock = lock;
+
   return TRUE;
 }
 
@@ -59,29 +62,17 @@ _dbus_data_slot_allocator_init (DBusDataSlotAllocator *allocator)
  * is allocated and stored at *slot_id_p.
  * 
  * @param allocator the allocator
- * @param mutex_loc the location lock for this allocator
  * @param slot_id_p address to fill with the slot ID
  * @returns #TRUE on success
  */
 dbus_bool_t
 _dbus_data_slot_allocator_alloc (DBusDataSlotAllocator *allocator,
-                                 DBusMutex             **mutex_loc,
                                  dbus_int32_t          *slot_id_p)
 {
   dbus_int32_t slot;
 
-  _dbus_mutex_lock (*mutex_loc);
-
-  if (allocator->n_allocated_slots == 0)
-    {
-      _dbus_assert (allocator->lock_loc == NULL);
-      allocator->lock_loc = mutex_loc;
-    }
-  else if (allocator->lock_loc != mutex_loc)
-    {
-      _dbus_warn_check_failed ("D-Bus threads were initialized after first using the D-Bus library. If your application does not directly initialize threads or use D-Bus, keep in mind that some library or plugin may have used D-Bus or initialized threads behind your back. You can often fix this problem by calling dbus_init_threads() or dbus_g_threads_init() early in your main() method, before D-Bus is used.\n");
-      _dbus_assert_not_reached ("exiting");
-    }
+  if (!_dbus_lock (allocator->lock))
+    return FALSE;
 
   if (*slot_id_p >= 0)
     {
@@ -144,7 +135,7 @@ _dbus_data_slot_allocator_alloc (DBusDataSlotAllocator *allocator,
                  slot, allocator, allocator->n_allocated_slots, allocator->n_used_slots);
   
  out:
-  _dbus_mutex_unlock (*(allocator->lock_loc));
+  _dbus_unlock (allocator->lock);
   return slot >= 0;
 }
 
@@ -163,8 +154,10 @@ void
 _dbus_data_slot_allocator_free (DBusDataSlotAllocator *allocator,
                                 dbus_int32_t          *slot_id_p)
 {
-  _dbus_mutex_lock (*(allocator->lock_loc));
-  
+  if (!_dbus_lock (allocator->lock))
+    _dbus_assert_not_reached ("we should have initialized global locks "
+        "before we allocated this slot");
+
   _dbus_assert (*slot_id_p < allocator->n_allocated_slots);
   _dbus_assert (allocator->allocated_slots[*slot_id_p].slot_id == *slot_id_p);
   _dbus_assert (allocator->allocated_slots[*slot_id_p].refcount > 0);
@@ -173,7 +166,7 @@ _dbus_data_slot_allocator_free (DBusDataSlotAllocator *allocator,
 
   if (allocator->allocated_slots[*slot_id_p].refcount > 0)
     {
-      _dbus_mutex_unlock (*(allocator->lock_loc));
+      _dbus_unlock (allocator->lock);
       return;
     }
 
@@ -188,19 +181,12 @@ _dbus_data_slot_allocator_free (DBusDataSlotAllocator *allocator,
   
   if (allocator->n_used_slots == 0)
     {
-      DBusMutex **mutex_loc = allocator->lock_loc;
-      
       dbus_free (allocator->allocated_slots);
       allocator->allocated_slots = NULL;
       allocator->n_allocated_slots = 0;
-      allocator->lock_loc = NULL;
-
-      _dbus_mutex_unlock (*mutex_loc);
-    }
-  else
-    {
-      _dbus_mutex_unlock (*(allocator->lock_loc));
     }
+
+  _dbus_unlock (allocator->lock);
 }
 
 /**
@@ -245,10 +231,13 @@ _dbus_data_slot_list_set  (DBusDataSlotAllocator *allocator,
    * be e.g. realloc()ing allocated_slots. We avoid doing this if asserts
    * are disabled, since then the asserts are empty.
    */
-  _dbus_mutex_lock (*(allocator->lock_loc));
+  if (!_dbus_lock (allocator->lock))
+    _dbus_assert_not_reached ("we should have initialized global locks "
+        "before we allocated this slot");
+
   _dbus_assert (slot < allocator->n_allocated_slots);
   _dbus_assert (allocator->allocated_slots[slot].slot_id == slot);
-  _dbus_mutex_unlock (*(allocator->lock_loc));
+  _dbus_unlock (allocator->lock);
 #endif
   
   if (slot >= list->n_slots)
@@ -302,11 +291,14 @@ _dbus_data_slot_list_get  (DBusDataSlotAllocator *allocator,
    * be e.g. realloc()ing allocated_slots. We avoid doing this if asserts
    * are disabled, since then the asserts are empty.
    */
-  _dbus_mutex_lock (*(allocator->lock_loc));
+  if (!_dbus_lock (allocator->lock))
+    _dbus_assert_not_reached ("we should have initialized global locks "
+        "before we allocated this slot");
+
   _dbus_assert (slot >= 0);
   _dbus_assert (slot < allocator->n_allocated_slots);
   _dbus_assert (allocator->allocated_slots[slot].slot_id == slot);
-  _dbus_mutex_unlock (*(allocator->lock_loc));
+  _dbus_unlock (allocator->lock);
 #endif
 
   if (slot >= list->n_slots)
@@ -356,7 +348,7 @@ _dbus_data_slot_list_free (DBusDataSlotList *list)
 
 /** @} */
 
-#ifdef DBUS_BUILD_TESTS
+#ifdef DBUS_ENABLE_EMBEDDED_TESTS
 #include "dbus-test.h"
 #include <stdio.h>
 
@@ -382,17 +374,12 @@ _dbus_data_slot_test (void)
   int i;
   DBusFreeFunction old_free_func;
   void *old_data;
-  DBusMutex *mutex;
-  
-  if (!_dbus_data_slot_allocator_init (&allocator))
+
+  if (!_dbus_data_slot_allocator_init (&allocator, _DBUS_LOCK_server_slots))
     _dbus_assert_not_reached ("no memory for allocator");
 
   _dbus_data_slot_list_init (&list);
 
-  _dbus_mutex_new_at_location (&mutex);
-  if (mutex == NULL)
-    _dbus_assert_not_reached ("failed to alloc mutex");
-  
 #define N_SLOTS 100
 
   i = 0;
@@ -403,8 +390,8 @@ _dbus_data_slot_test (void)
        * here.
        */
       dbus_int32_t tmp = -1;
-      
-      _dbus_data_slot_allocator_alloc (&allocator, &mutex, &tmp);
+
+      _dbus_data_slot_allocator_alloc (&allocator, &tmp);
 
       if (tmp != i)
         _dbus_assert_not_reached ("did not allocate slots in numeric order\n");
@@ -469,9 +456,7 @@ _dbus_data_slot_test (void)
       ++i;
     }
 
-  _dbus_mutex_free_at_location (&mutex);
-  
   return TRUE;
 }
 
-#endif /* DBUS_BUILD_TESTS */
+#endif /* DBUS_ENABLE_EMBEDDED_TESTS */