#include <mono/io-layer/wapi-private.h>
#include <mono/io-layer/misc-private.h>
#include <mono/io-layer/handles-private.h>
-#include <mono/io-layer/mono-mutex.h>
#include <mono/io-layer/mutex-private.h>
+#include <mono/utils/mono-mutex.h>
-#undef DEBUG
+#if 0
+#define DEBUG(...) g_message(__VA_ARGS__)
+#else
+#define DEBUG(...)
+#endif
static void mutex_signal(gpointer handle);
static gboolean mutex_own (gpointer handle);
_wapi_thread_own_mutex (handle);
-#ifdef DEBUG
- g_message("%s: owning mutex handle %p", __func__, handle);
-#endif
+ DEBUG("%s: owning mutex handle %p", __func__, handle);
_wapi_handle_set_signal_state (handle, FALSE, FALSE);
mutex_handle->tid = pthread_self ();
mutex_handle->recursion++;
-#ifdef DEBUG
- g_message ("%s: mutex handle %p locked %d times by %d:%ld", __func__,
+ DEBUG ("%s: mutex handle %p locked %d times by %d:%ld", __func__,
handle, mutex_handle->recursion, mutex_handle->pid,
mutex_handle->tid);
-#endif
return(TRUE);
}
return(FALSE);
}
-#ifdef DEBUG
- g_message("%s: testing ownership mutex handle %p", __func__, handle);
-#endif
+ DEBUG("%s: testing ownership mutex handle %p", __func__, handle);
if (mutex_handle->recursion > 0 &&
mutex_handle->pid == _wapi_getpid () &&
pthread_equal (mutex_handle->tid, pthread_self ())) {
-#ifdef DEBUG
- g_message ("%s: mutex handle %p owned by %d:%ld", __func__,
+ DEBUG ("%s: mutex handle %p owned by %d:%ld", __func__,
handle, _wapi_getpid (), pthread_self ());
-#endif
return(TRUE);
} else {
-#ifdef DEBUG
- g_message ("%s: mutex handle %p not owned by %d:%ld, but locked %d times by %d:%ld", __func__, handle, _wapi_getpid (), pthread_self (), mutex_handle->recursion, mutex_handle->pid, mutex_handle->tid);
-#endif
+ DEBUG ("%s: mutex handle %p not owned by %d:%ld, but locked %d times by %d:%ld", __func__, handle, _wapi_getpid (), pthread_self (), mutex_handle->recursion, mutex_handle->pid, mutex_handle->tid);
return(FALSE);
}
struct _WapiHandle_namedmutex *namedmutex_handle;
gboolean ok;
-#ifdef DEBUG
- g_message ("%s: owning named mutex handle %p", __func__, handle);
-#endif
+ DEBUG ("%s: owning named mutex handle %p", __func__, handle);
ok = _wapi_lookup_handle (handle, WAPI_HANDLE_NAMEDMUTEX,
(gpointer *)&namedmutex_handle);
_wapi_shared_handle_set_signal_state (handle, FALSE);
-#ifdef DEBUG
- g_message ("%s: mutex handle %p locked %d times by %d:%ld", __func__,
+ DEBUG ("%s: mutex handle %p locked %d times by %d:%ld", __func__,
handle, namedmutex_handle->recursion,
namedmutex_handle->pid, namedmutex_handle->tid);
-#endif
return(TRUE);
}
return(FALSE);
}
-#ifdef DEBUG
- g_message ("%s: testing ownership mutex handle %p", __func__, handle);
-#endif
+ DEBUG ("%s: testing ownership mutex handle %p", __func__, handle);
if (namedmutex_handle->recursion > 0 &&
namedmutex_handle->pid == _wapi_getpid () &&
pthread_equal (namedmutex_handle->tid, pthread_self ())) {
-#ifdef DEBUG
- g_message ("%s: mutex handle %p owned by %d:%ld", __func__,
+ DEBUG ("%s: mutex handle %p owned by %d:%ld", __func__,
handle, _wapi_getpid (), pthread_self ());
-#endif
return(TRUE);
} else {
-#ifdef DEBUG
- g_message ("%s: mutex handle %p not owned by %d:%ld, but locked %d times by %d:%ld", __func__, handle, _wapi_getpid (), pthread_self (), namedmutex_handle->recursion, namedmutex_handle->pid, namedmutex_handle->tid);
-#endif
+ DEBUG ("%s: mutex handle %p not owned by %d:%ld, but locked %d times by %d:%ld", __func__, handle, _wapi_getpid (), pthread_self (), namedmutex_handle->recursion, namedmutex_handle->pid, namedmutex_handle->tid);
return(FALSE);
}
return;
}
-#ifdef DEBUG
- g_message ("%s: Checking ownership of named mutex handle %p", __func__,
+ DEBUG ("%s: Checking ownership of named mutex handle %p", __func__,
handle);
-#endif
if (namedmutex_handle->recursion == 0) {
-#ifdef DEBUG
- g_message ("%s: Named mutex handle %p not owned", __func__,
+ DEBUG ("%s: Named mutex handle %p not owned", __func__,
handle);
-#endif
} else if (namedmutex_handle->pid == _wapi_getpid ()) {
-#ifdef DEBUG
- g_message ("%s: Named mutex handle %p owned by this process",
+ DEBUG ("%s: Named mutex handle %p owned by this process",
__func__, handle);
-#endif
} else {
- guint32 *pids = g_new0 (guint32, 32);
- guint32 count = 32, needed_bytes, i;
- gboolean ret;
int thr_ret;
+ gpointer proc_handle;
-#ifdef DEBUG
- g_message ("%s: Named mutex handle %p owned by another process", __func__, handle);
-#endif
-
- ret = EnumProcesses (pids, count * sizeof(guint32),
- &needed_bytes);
- if (ret == FALSE) {
- do {
- count = needed_bytes / sizeof(guint32);
-#ifdef DEBUG
- g_message ("%s: Retrying pid lookup with %d slots", __func__, count);
-#endif
- pids = g_renew (guint32, pids, count);
- ret = EnumProcesses (pids, needed_bytes,
- &needed_bytes);
- } while (ret == FALSE);
- }
-
- count = needed_bytes / sizeof(guint32);
-
-#ifdef DEBUG
- g_message ("%s: Need to look at %d pids for named mutex handle %p", __func__, count, handle);
-#endif
-
- thr_ret = _wapi_handle_lock_shared_handles ();
- g_assert (thr_ret == 0);
-
- for (i = 0; i < count; i++) {
-#ifdef DEBUG
- g_message ("%s: Checking pid %d for named mutex handle %p", __func__, pids[i], handle);
-#endif
-
- if (pids[i] == namedmutex_handle->pid) {
- /* Must be still alive, because
- * EnumProcesses() checks for us
- */
-#ifdef DEBUG
- g_message ("%s: Found active pid %d for named mutex handle %p", __func__, pids[i], handle);
-#endif
-
- break;
- }
- }
-
- g_free (pids);
-
- if (i == count) {
+ DEBUG ("%s: Named mutex handle %p owned by another process", __func__, handle);
+ proc_handle = OpenProcess (0, 0, namedmutex_handle->pid);
+ if (proc_handle == NULL) {
/* Didn't find the process that this handle
* was owned by, overriding it
*/
-
-#ifdef DEBUG
- g_message ("%s: overriding old owner of named mutex handle %p", __func__, handle);
-#endif
+ DEBUG ("%s: overriding old owner of named mutex handle %p", __func__, handle);
+ thr_ret = _wapi_handle_lock_shared_handles ();
+ g_assert (thr_ret == 0);
namedmutex_handle->pid = 0;
namedmutex_handle->tid = 0;
namedmutex_handle->recursion = 0;
_wapi_shared_handle_set_signal_state (handle, TRUE);
+ _wapi_handle_unlock_shared_handles ();
+ } else {
+ DEBUG ("%s: Found active pid %d for named mutex handle %p", __func__, namedmutex_handle->pid, handle);
}
-
- _wapi_handle_unlock_shared_handles ();
+ if (proc_handle != NULL)
+ CloseProcess (proc_handle);
}
}
if (mutex_handle->pid == pid &&
pthread_equal (mutex_handle->tid, tid)) {
-#ifdef DEBUG
- g_message ("%s: Mutex handle %p abandoned!", __func__, handle);
-#endif
+ DEBUG ("%s: Mutex handle %p abandoned!", __func__, handle);
mutex_handle->recursion = 0;
mutex_handle->pid = 0;
if (mutex_handle->pid == pid &&
pthread_equal (mutex_handle->tid, tid)) {
-#ifdef DEBUG
- g_message ("%s: Mutex handle %p abandoned!", __func__, handle);
-#endif
+ DEBUG ("%s: Mutex handle %p abandoned!", __func__, handle);
mutex_handle->recursion = 0;
mutex_handle->pid = 0;
*/
SetLastError (ERROR_SUCCESS);
-#ifdef DEBUG
- g_message ("%s: Creating unnamed mutex", __func__);
-#endif
+ DEBUG ("%s: Creating unnamed mutex", __func__);
handle = _wapi_handle_new (WAPI_HANDLE_MUTEX, &mutex_handle);
if (handle == _WAPI_HANDLE_INVALID) {
_wapi_handle_set_signal_state (handle, TRUE, FALSE);
}
-#ifdef DEBUG
- g_message ("%s: returning mutex handle %p", __func__, handle);
-#endif
+ DEBUG ("%s: returning mutex handle %p", __func__, handle);
thr_ret = _wapi_handle_unlock_handle (handle);
g_assert (thr_ret == 0);
utf8_name = g_utf16_to_utf8 (name, -1, NULL, NULL, NULL);
-#ifdef DEBUG
- g_message ("%s: Creating named mutex [%s]", __func__, utf8_name);
-#endif
+ DEBUG ("%s: Creating named mutex [%s]", __func__, utf8_name);
offset = _wapi_search_handle_namespace (WAPI_HANDLE_NAMEDMUTEX,
utf8_name);
_wapi_handle_unlock_shared_handles ();
}
-#ifdef DEBUG
- g_message ("%s: returning mutex handle %p", __func__, handle);
-#endif
+ DEBUG ("%s: returning mutex handle %p", __func__, handle);
cleanup:
g_free (utf8_name);
thr_ret = _wapi_handle_lock_handle (handle);
g_assert (thr_ret == 0);
-#ifdef DEBUG
- g_message("%s: Releasing mutex handle %p", __func__, handle);
-#endif
+ DEBUG("%s: Releasing mutex handle %p", __func__, handle);
if (!pthread_equal (mutex_handle->tid, tid) ||
mutex_handle->pid != pid) {
-#ifdef DEBUG
- g_message("%s: We don't own mutex handle %p (owned by %d:%ld, me %d:%ld)", __func__, handle, mutex_handle->pid, mutex_handle->tid, _wapi_getpid (), tid);
-#endif
+ DEBUG("%s: We don't own mutex handle %p (owned by %d:%ld, me %d:%ld)", __func__, handle, mutex_handle->pid, mutex_handle->tid, _wapi_getpid (), tid);
goto cleanup;
}
if(mutex_handle->recursion==0) {
_wapi_thread_disown_mutex (handle);
-#ifdef DEBUG
- g_message("%s: Unlocking mutex handle %p", __func__, handle);
-#endif
+ DEBUG("%s: Unlocking mutex handle %p", __func__, handle);
mutex_handle->pid=0;
mutex_handle->tid=0;
thr_ret = _wapi_handle_lock_shared_handles ();
g_assert (thr_ret == 0);
-#ifdef DEBUG
- g_message("%s: Releasing mutex handle %p", __func__, handle);
-#endif
+ DEBUG("%s: Releasing mutex handle %p", __func__, handle);
if (!pthread_equal (mutex_handle->tid, tid) ||
mutex_handle->pid != pid) {
-#ifdef DEBUG
- g_message("%s: We don't own mutex handle %p (owned by %d:%ld, me %d:%ld)", __func__, handle, mutex_handle->pid, mutex_handle->tid, _wapi_getpid (), tid);
-#endif
+ DEBUG("%s: We don't own mutex handle %p (owned by %d:%ld, me %d:%ld)", __func__, handle, mutex_handle->pid, mutex_handle->tid, _wapi_getpid (), tid);
goto cleanup;
}
if(mutex_handle->recursion==0) {
_wapi_thread_disown_mutex (handle);
-#ifdef DEBUG
- g_message("%s: Unlocking mutex handle %p", __func__, handle);
-#endif
+ DEBUG("%s: Unlocking mutex handle %p", __func__, handle);
mutex_handle->pid=0;
mutex_handle->tid=0;
utf8_name = g_utf16_to_utf8 (name, -1, NULL, NULL, NULL);
-#ifdef DEBUG
- g_message ("%s: Opening named mutex [%s]", __func__, utf8_name);
-#endif
+ DEBUG ("%s: Opening named mutex [%s]", __func__, utf8_name);
offset = _wapi_search_handle_namespace (WAPI_HANDLE_NAMEDMUTEX,
utf8_name);
}
ret = handle;
-#ifdef DEBUG
- g_message ("%s: returning named mutex handle %p", __func__, handle);
-#endif
+ DEBUG ("%s: returning named mutex handle %p", __func__, handle);
cleanup:
g_free (utf8_name);