-static void
-shutdown_uninitialized_locks (void *data)
-{
- _dbus_list_clear (&uninitialized_rmutex_list);
- _dbus_list_clear (&uninitialized_cmutex_list);
- _dbus_list_clear (&uninitialized_condvar_list);
-}
-
-/* init_global_locks() must be called first. */
-static dbus_bool_t
-init_uninitialized_locks (void)
-{
- DBusList *link;
- dbus_bool_t ok;
-
- _dbus_assert (thread_init_generation != _dbus_current_generation);
-
- link = uninitialized_rmutex_list;
- while (link != NULL)
- {
- DBusRMutex **mp;
-
- mp = link->data;
- _dbus_assert (*mp == _DBUS_DUMMY_RMUTEX);
-
- *mp = _dbus_platform_rmutex_new ();
- if (*mp == NULL)
- goto fail_mutex;
-
- link = _dbus_list_get_next_link (&uninitialized_rmutex_list, link);
- }
-
- link = uninitialized_cmutex_list;
- while (link != NULL)
- {
- DBusCMutex **mp;
-
- mp = link->data;
- _dbus_assert (*mp == _DBUS_DUMMY_CMUTEX);
-
- *mp = _dbus_platform_cmutex_new ();
- if (*mp == NULL)
- goto fail_mutex;
-
- link = _dbus_list_get_next_link (&uninitialized_cmutex_list, link);
- }
-
- link = uninitialized_condvar_list;
- while (link != NULL)
- {
- DBusCondVar **cp;
-
- cp = (DBusCondVar **)link->data;
- _dbus_assert (*cp == _DBUS_DUMMY_CONDVAR);
-
- *cp = _dbus_platform_condvar_new ();
- if (*cp == NULL)
- goto fail_condvar;
-
- link = _dbus_list_get_next_link (&uninitialized_condvar_list, link);
- }
-
- _dbus_list_clear (&uninitialized_rmutex_list);
- _dbus_list_clear (&uninitialized_cmutex_list);
- _dbus_list_clear (&uninitialized_condvar_list);
-
- /* This assumes that init_global_locks() has already been called. */
- _dbus_platform_rmutex_lock (global_locks[_DBUS_LOCK_shutdown_funcs]);
- ok = _dbus_register_shutdown_func_unlocked (shutdown_uninitialized_locks, NULL);
- _dbus_platform_rmutex_unlock (global_locks[_DBUS_LOCK_shutdown_funcs]);
-
- if (!ok)
- goto fail_condvar;
-
- return TRUE;
-
- fail_condvar:
- link = uninitialized_condvar_list;
- while (link != NULL)
- {
- DBusCondVar **cp;
-
- cp = link->data;
-
- if (*cp != _DBUS_DUMMY_CONDVAR && *cp != NULL)
- _dbus_platform_condvar_free (*cp);
-
- *cp = _DBUS_DUMMY_CONDVAR;
-
- link = _dbus_list_get_next_link (&uninitialized_condvar_list, link);
- }
-
- fail_mutex:
- link = uninitialized_rmutex_list;
- while (link != NULL)
- {
- DBusRMutex **mp;
-
- mp = link->data;
-
- if (*mp != _DBUS_DUMMY_RMUTEX && *mp != NULL)
- _dbus_platform_rmutex_free (*mp);
-
- *mp = _DBUS_DUMMY_RMUTEX;
-
- link = _dbus_list_get_next_link (&uninitialized_rmutex_list, link);
- }
-
- link = uninitialized_cmutex_list;
- while (link != NULL)
- {
- DBusCMutex **mp;
-
- mp = link->data;
-
- if (*mp != _DBUS_DUMMY_CMUTEX && *mp != NULL)
- _dbus_platform_cmutex_free (*mp);
-
- *mp = _DBUS_DUMMY_CMUTEX;
-
- link = _dbus_list_get_next_link (&uninitialized_cmutex_list, link);
- }
-
- return FALSE;
-}
-