mirror of
https://gitlab.freedesktop.org/dbus/dbus.git
synced 2026-04-18 08:30:45 +02:00
Allow both recursive and non-recursive mutexes to be supplied
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=43744 Signed-off-by: Simon McVittie <simon.mcvittie@collabora.co.uk> Reviewed-by: Thiago Macieira <thiago@kde.org>
This commit is contained in:
parent
8a58250acf
commit
f85ca5fac1
2 changed files with 17 additions and 25 deletions
|
|
@ -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)
|
|||
|
||||
if (functions->mask & DBUS_THREAD_FUNCTIONS_RECURSIVE_MUTEX_NEW_MASK)
|
||||
thread_functions.recursive_mutex_new = functions->recursive_mutex_new;
|
||||
|
||||
else
|
||||
thread_functions.recursive_mutex_new = NULL;
|
||||
|
||||
if (functions->mask & DBUS_THREAD_FUNCTIONS_RECURSIVE_MUTEX_FREE_MASK)
|
||||
thread_functions.recursive_mutex_free = functions->recursive_mutex_free;
|
||||
|
||||
else
|
||||
thread_functions.recursive_mutex_free = NULL;
|
||||
|
||||
if (functions->mask & DBUS_THREAD_FUNCTIONS_RECURSIVE_MUTEX_LOCK_MASK)
|
||||
thread_functions.recursive_mutex_lock = functions->recursive_mutex_lock;
|
||||
else
|
||||
thread_functions.recursive_mutex_lock = NULL;
|
||||
|
||||
if (functions->mask & DBUS_THREAD_FUNCTIONS_RECURSIVE_MUTEX_UNLOCK_MASK)
|
||||
thread_functions.recursive_mutex_unlock = functions->recursive_mutex_unlock;
|
||||
else
|
||||
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
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue