Commit f85ca5fa authored by Simon McVittie's avatar Simon McVittie

Allow both recursive and non-recursive mutexes to be supplied

Bug: default avatarSimon McVittie <>
Reviewed-by: Thiago Macieira's avatarThiago Macieira <>
parent 8a58250a
......@@ -734,13 +734,6 @@ dbus_threads_init (const DBusThreadFunctions *functions)
"functions sets should be passed into "
"dbus_threads_init. Neither sets were passed.");
if (mutex_set && recursive_mutex_set)
_dbus_assert_not_reached ("Either the nonrecusrive or recursive mutex "
"functions sets should be passed into "
"dbus_threads_init. Both sets were passed. "
"You most likely just want to set the recursive "
"mutex functions to avoid deadlocks in D-Bus.");
/* Check that all bits in the mask actually are valid mask bits.
* ensures people won't write code that breaks when we add
* new bits.
......@@ -770,15 +763,23 @@ dbus_threads_init (const DBusThreadFunctions *functions)
thread_functions.recursive_mutex_new = functions->recursive_mutex_new;
thread_functions.recursive_mutex_new = NULL;
thread_functions.recursive_mutex_free = functions->recursive_mutex_free;
thread_functions.recursive_mutex_free = NULL;
thread_functions.recursive_mutex_lock = functions->recursive_mutex_lock;
thread_functions.recursive_mutex_lock = NULL;
thread_functions.recursive_mutex_unlock = functions->recursive_mutex_unlock;
thread_functions.recursive_mutex_unlock = NULL;
thread_functions.mask = functions->mask;
......@@ -139,24 +139,15 @@ typedef enum
* Functions that must be implemented to make the D-Bus library
* thread-aware. The recursive mutex functions should be specified
* rather than the old, deprecated nonrecursive ones.
* thread-aware.
* The condition variable functions have to work with recursive
* mutexes if you provide those, or with nonrecursive mutexes if you
* provide those.
* If you supply both recursive and non-recursive mutexes,
* libdbus will use the non-recursive version for condition variables,
* and the recursive version in other contexts.
* If implementing threads using pthreads, be aware that
* PTHREAD_MUTEX_RECURSIVE is broken in combination with condition
* variables. libdbus relies on the Java-style behavior that when
* waiting on a condition, the recursion count is saved and restored,
* and the mutex is completely unlocked, not just decremented one
* level of recursion.
* Thus with pthreads you probably have to roll your own emulated
* recursive mutexes, you can't use PTHREAD_MUTEX_RECURSIVE. This is
* what dbus_threads_init_default() does on platforms that use
* pthreads.
* The condition variable functions have to work with nonrecursive
* mutexes if you provide those, or with recursive mutexes if you
* don't.
typedef struct
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment