summaryrefslogtreecommitdiff
path: root/dbus/dbus-sysdeps-thread-win.c
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2012-02-20 15:20:41 +0000
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2012-02-21 14:41:40 +0000
commit8d2b313158b3c5f12a56608cc80d0c3138de0a09 (patch)
tree114f0eff0185680287e534bcbe542e4a927b1f0f /dbus/dbus-sysdeps-thread-win.c
parent0be00e6c56f731fbb41b7b9220cdaed5b3fdec74 (diff)
downloaddbus-8d2b313158b3c5f12a56608cc80d0c3138de0a09.tar.gz
Never use non-libdbus threading primitives
This lets us simplify considerably, by assuming that we always have both recursive and suitable-for-condition-variable mutexes. The Windows implementation has been compiled (on 32-bit mingw-w64) but not tested. Justification for the approach used on Windows, and in particular, using the existing "non-recursive" locks as if they were recursive: * We've been using them in conjunction with condition variables all along, so they'd better be suitable * On fd.o #36204, Ralf points out that mutexes created via CreateMutex are, in fact, recursive * Havoc's admonitions about requiring "Java-style" recursive locking (waiting for a condition variable while holding a recursive lock requires releasing that lock n times) turn out not to apply to either of our uses of DBusCondVar in DBusConnection, because the lock is only held for a short time, without calling into user code; indeed, our Unix implementation isn't recursive anyway, so if the Windows implementation reaches the deadlocking situation somehow (waiting for condition variable while locked more than once), the Unix implementation would already have deadlocked on the same code path (trying to lock more than once) One possible alternative to a CreateMutex mutex for use with condition variables would be a CRITICAL_SECTION. I'm not going to implement this, but Windows developers are welcome to do so. Bug: https://bugs.freedesktop.org/show_bug.cgi?id=36204 Bug: https://bugs.freedesktop.org/show_bug.cgi?id=43744 Reviewed-by: Thiago Macieira <thiago@kde.org>
Diffstat (limited to 'dbus/dbus-sysdeps-thread-win.c')
-rw-r--r--dbus/dbus-sysdeps-thread-win.c110
1 files changed, 56 insertions, 54 deletions
diff --git a/dbus/dbus-sysdeps-thread-win.c b/dbus/dbus-sysdeps-thread-win.c
index e2972a31..db486194 100644
--- a/dbus/dbus-sysdeps-thread-win.c
+++ b/dbus/dbus-sysdeps-thread-win.c
@@ -90,34 +90,60 @@ DllMain (hinst_t hinstDLL,
return TRUE;
}
-static DBusMutex*
-_dbus_windows_mutex_new (void)
+DBusCMutex *
+_dbus_platform_cmutex_new (void)
{
HANDLE handle;
handle = CreateMutex (NULL, FALSE, NULL);
- return (DBusMutex *) handle;
+ return (DBusCMutex *) handle;
}
-static void
-_dbus_windows_mutex_free (DBusMutex *mutex)
+DBusRMutex *
+_dbus_platform_rmutex_new (void)
+{
+ HANDLE handle;
+ handle = CreateMutex (NULL, FALSE, NULL);
+ return (DBusRMutex *) handle;
+}
+
+void
+_dbus_platform_cmutex_free (DBusCMutex *mutex)
{
CloseHandle ((HANDLE *) mutex);
}
-static dbus_bool_t
-_dbus_windows_mutex_lock (DBusMutex *mutex)
+void
+_dbus_platform_rmutex_free (DBusRMutex *mutex)
{
- return WaitForSingleObject ((HANDLE *) mutex, INFINITE) != WAIT_FAILED;
+ CloseHandle ((HANDLE *) mutex);
}
-static dbus_bool_t
-_dbus_windows_mutex_unlock (DBusMutex *mutex)
+void
+_dbus_platform_cmutex_lock (DBusCMutex *mutex)
+{
+ WaitForSingleObject ((HANDLE *) mutex, INFINITE);
+}
+
+void
+_dbus_platform_rmutex_lock (DBusRMutex *mutex)
{
- return ReleaseMutex ((HANDLE *) mutex) != 0;
+ WaitForSingleObject ((HANDLE *) mutex, INFINITE);
}
-static DBusCondVar *
-_dbus_windows_condvar_new (void)
+void
+_dbus_platform_cmutex_unlock (DBusCMutex *mutex)
+{
+ ReleaseMutex ((HANDLE *) mutex);
+}
+
+void
+_dbus_platform_rmutex_unlock (DBusRMutex *mutex)
+{
+ ReleaseMutex ((HANDLE *) mutex);
+}
+
+DBusCondVar *
+_dbus_platform_condvar_new (void)
{
DBusCondVar *cond;
@@ -128,11 +154,11 @@ _dbus_windows_condvar_new (void)
cond->list = NULL;
InitializeCriticalSection (&cond->lock);
- return (DBusCondVar *) cond;
+ return cond;
}
-static void
-_dbus_windows_condvar_free (DBusCondVar *cond)
+void
+_dbus_platform_condvar_free (DBusCondVar *cond)
{
DeleteCriticalSection (&cond->lock);
_dbus_list_clear (&cond->list);
@@ -141,7 +167,7 @@ _dbus_windows_condvar_free (DBusCondVar *cond)
static dbus_bool_t
_dbus_condvar_wait_win32 (DBusCondVar *cond,
- DBusMutex *mutex,
+ DBusCMutex *mutex,
int milliseconds)
{
DWORD retval;
@@ -168,9 +194,9 @@ _dbus_condvar_wait_win32 (DBusCondVar *cond,
if (!ret)
return FALSE; /* Prepend failed */
- _dbus_mutex_unlock (mutex);
+ _dbus_platform_cmutex_unlock (mutex);
retval = WaitForSingleObject (event, milliseconds);
- _dbus_mutex_lock (mutex);
+ _dbus_platform_cmutex_lock (mutex);
if (retval == WAIT_TIMEOUT)
{
@@ -198,23 +224,23 @@ _dbus_condvar_wait_win32 (DBusCondVar *cond,
return retval != WAIT_TIMEOUT;
}
-static void
-_dbus_windows_condvar_wait (DBusCondVar *cond,
- DBusMutex *mutex)
+void
+_dbus_platform_condvar_wait (DBusCondVar *cond,
+ DBusCMutex *mutex)
{
_dbus_condvar_wait_win32 (cond, mutex, INFINITE);
}
-static dbus_bool_t
-_dbus_windows_condvar_wait_timeout (DBusCondVar *cond,
- DBusMutex *mutex,
+dbus_bool_t
+_dbus_platform_condvar_wait_timeout (DBusCondVar *cond,
+ DBusCMutex *mutex,
int timeout_milliseconds)
{
return _dbus_condvar_wait_win32 (cond, mutex, timeout_milliseconds);
}
-static void
-_dbus_windows_condvar_wake_one (DBusCondVar *cond)
+void
+_dbus_platform_condvar_wake_one (DBusCondVar *cond)
{
EnterCriticalSection (&cond->lock);
@@ -230,8 +256,8 @@ _dbus_windows_condvar_wake_one (DBusCondVar *cond)
LeaveCriticalSection (&cond->lock);
}
-static void
-_dbus_windows_condvar_wake_all (DBusCondVar *cond)
+void
+_dbus_platform_condvar_wake_all (DBusCondVar *cond)
{
EnterCriticalSection (&cond->lock);
@@ -250,30 +276,6 @@ _dbus_windows_condvar_wake_all (DBusCondVar *cond)
LeaveCriticalSection (&cond->lock);
}
-static const DBusThreadFunctions windows_functions =
-{
- DBUS_THREAD_FUNCTIONS_MUTEX_NEW_MASK |
- DBUS_THREAD_FUNCTIONS_MUTEX_FREE_MASK |
- DBUS_THREAD_FUNCTIONS_MUTEX_LOCK_MASK |
- DBUS_THREAD_FUNCTIONS_MUTEX_UNLOCK_MASK |
- DBUS_THREAD_FUNCTIONS_CONDVAR_NEW_MASK |
- DBUS_THREAD_FUNCTIONS_CONDVAR_FREE_MASK |
- DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_MASK |
- DBUS_THREAD_FUNCTIONS_CONDVAR_WAIT_TIMEOUT_MASK |
- DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ONE_MASK|
- DBUS_THREAD_FUNCTIONS_CONDVAR_WAKE_ALL_MASK,
- _dbus_windows_mutex_new,
- _dbus_windows_mutex_free,
- _dbus_windows_mutex_lock,
- _dbus_windows_mutex_unlock,
- _dbus_windows_condvar_new,
- _dbus_windows_condvar_free,
- _dbus_windows_condvar_wait,
- _dbus_windows_condvar_wait_timeout,
- _dbus_windows_condvar_wake_one,
- _dbus_windows_condvar_wake_all
-};
-
dbus_bool_t
_dbus_threads_init_platform_specific (void)
{
@@ -287,6 +289,6 @@ _dbus_threads_init_platform_specific (void)
return FALSE;
}
- return dbus_threads_init (&windows_functions);
+ return dbus_threads_init (NULL);
}