Merge pull request #615 from nealef/master
[mono.git] / mono / io-layer / critical-sections.c
index ba1a331ea347173f9ab0676b254d98c8046f1ed0..d9ba58bd859b9cf27b54931dd8a1ae72dcd371ac 100644 (file)
 #include <config.h>
 #include <glib.h>
 #include <pthread.h>
+#include <errno.h>
 
-#include "mono/io-layer/wapi.h"
+#include <mono/io-layer/wapi.h>
+#include <mono/io-layer/critical-section-private.h>
 
-#include "mono-mutex.h"
-
-#undef DEBUG
+#include <mono/utils/mono-mutex.h>
 
 /* A critical section is really just like a lightweight mutex. It
  * can't be waited for, and doesn't have a handle.
  */
 
-/* According to the MSDN docs, the Microsoft implementation spins a
- * number of times then waits for a semaphore.  I could implement that
- * here but I'd need a mutex around the critical section structure
- * anyway.  So I may as well just use a pthread mutex.
- */
-static mono_once_t attr_key_once=MONO_ONCE_INIT;
-static mono_mutexattr_t attr;
-
-static void attr_init(void)
-{
-       int ret;
-       
-       ret = mono_mutexattr_init(&attr);
-       g_assert (ret == 0);
-       
-       ret = mono_mutexattr_settype(&attr, MONO_MUTEX_RECURSIVE);
-       g_assert (ret == 0);
-}
-
 /**
  * InitializeCriticalSection:
  * @section: The critical section to initialise
@@ -50,8 +31,7 @@ void InitializeCriticalSection(WapiCriticalSection *section)
 {
        int ret;
        
-       mono_once(&attr_key_once, attr_init);
-       ret = mono_mutex_init(&section->mutex, &attr);
+       ret = mono_mutex_init_recursive (&section->mutex);
        g_assert (ret == 0);
 }
 
@@ -86,7 +66,8 @@ void DeleteCriticalSection(WapiCriticalSection *section)
        int ret;
        
        ret = mono_mutex_destroy(&section->mutex);
-       g_assert (ret == 0);
+       if (ret)
+               g_error ("Failed to destroy mutex %p error code %d errno %d", &section->mutex, ret, errno);
 }
 
 /**