From b508d872993c8e263edf3809c0d60d0c9914d05a Mon Sep 17 00:00:00 2001 From: Rodrigo Kumpera Date: Thu, 10 Feb 2011 21:44:58 +0100 Subject: [PATCH] Revert "Don't use io layer semaphores for object monitors." This reverts commit 7d0e224a7a67b32b214e7eadcc2089708bbd3914. This is causing severe regressions on OSX. --- mono/metadata/monitor.c | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/mono/metadata/monitor.c b/mono/metadata/monitor.c index bd588fc851a..7a409e2d56e 100644 --- a/mono/metadata/monitor.c +++ b/mono/metadata/monitor.c @@ -26,7 +26,6 @@ #include #include #include -#include /* * Pull the list of opcodes @@ -81,7 +80,7 @@ struct _MonoThreadsSync gint32 hash_code; #endif volatile gint32 entry_count; - MonoSemType *entry_sem; + HANDLE entry_sem; GSList *wait_list; void *data; }; @@ -229,8 +228,7 @@ mon_finalize (MonoThreadsSync *mon) LOCK_DEBUG (g_message ("%s: Finalizing sync %p", __func__, mon)); if (mon->entry_sem != NULL) { - MONO_SEM_DESTROY (mon->entry_sem); - g_free (mon->entry_sem); + CloseHandle (mon->entry_sem); mon->entry_sem = NULL; } /* If this isn't empty then something is seriously broken - it @@ -414,7 +412,7 @@ mono_monitor_try_enter_internal (MonoObject *obj, guint32 ms, gboolean allow_int { MonoThreadsSync *mon; gsize id = GetCurrentThreadId (); - MonoSemType *sem; + HANDLE sem; guint32 then = 0, now, delta; guint32 waitms; guint32 ret; @@ -583,13 +581,11 @@ retry_contended: */ if (mon->entry_sem == NULL) { /* Create the semaphore */ - sem = g_new0 (MonoSemType, 1); - MONO_SEM_INIT (sem, 0); + sem = CreateSemaphore (NULL, 0, 0x7fffffff, NULL); g_assert (sem != NULL); if (InterlockedCompareExchangePointer ((gpointer*)&mon->entry_sem, sem, NULL) != NULL) { /* Someone else just put a handle here */ - MONO_SEM_DESTROY (sem); - g_free (sem); + CloseHandle (sem); } } @@ -626,7 +622,7 @@ retry_contended: * We pass TRUE instead of allow_interruption since we have to check for the * StopRequested case below. */ - ret = MONO_SEM_TIMEDWAIT_ALERTABLE(mon->entry_sem, waitms, TRUE); + ret = WaitForSingleObjectEx (mon->entry_sem, waitms, TRUE); mono_thread_clr_state (thread, ThreadState_WaitSleepJoin); @@ -750,7 +746,7 @@ mono_monitor_exit (MonoObject *obj) * struct. */ if (mon->entry_count > 0) { - MONO_SEM_POST (mon->entry_sem); + ReleaseSemaphore (mon->entry_sem, 1, NULL); } } else { LOCK_DEBUG (g_message ("%s: (%d) Object %p is now locked %d times", __func__, GetCurrentThreadId (), obj, nest)); -- 2.25.1