Revert "Don't use io layer semaphores for object monitors."
authorRodrigo Kumpera <kumpera@gmail.com>
Thu, 10 Feb 2011 20:44:58 +0000 (21:44 +0100)
committerRodrigo Kumpera <kumpera@gmail.com>
Thu, 10 Feb 2011 20:44:58 +0000 (21:44 +0100)
This reverts commit 7d0e224a7a67b32b214e7eadcc2089708bbd3914.

This is causing severe regressions on OSX.

mono/metadata/monitor.c

index bd588fc851a823a4720b4976f4800757a690ddb0..7a409e2d56ef64c38126af7013e59f0ab3b0dcef 100644 (file)
@@ -26,7 +26,6 @@
 #include <mono/metadata/marshal.h>
 #include <mono/metadata/profiler-private.h>
 #include <mono/utils/mono-time.h>
-#include <mono/utils/mono-semaphore.h>
 
 /*
  * 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));