Piotr Caban : msvcp90: Use critical sections in mutex object.

Alexandre Julliard julliard at winehq.org
Fri Nov 2 15:52:03 CDT 2012


Module: wine
Branch: master
Commit: 5e1cbccebf9a796782402038453833fa33b9917f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5e1cbccebf9a796782402038453833fa33b9917f

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri Nov  2 20:06:08 2012 +0100

msvcp90: Use critical sections in mutex object.

---

 dlls/msvcp100/misc.c   |   18 ++++++++++++++----
 dlls/msvcp100/msvcp.h  |    2 +-
 dlls/msvcp60/misc.c    |   16 ++++++++++++----
 dlls/msvcp71/misc.c    |   18 ++++++++++++++----
 dlls/msvcp71/msvcp.h   |    2 +-
 dlls/msvcp90/misc.c    |   18 ++++++++++++++----
 dlls/msvcp90/msvcp90.h |    2 +-
 7 files changed, 57 insertions(+), 19 deletions(-)

diff --git a/dlls/msvcp100/misc.c b/dlls/msvcp100/misc.c
index 40f9fed..5854c5e 100644
--- a/dlls/msvcp100/misc.c
+++ b/dlls/msvcp100/misc.c
@@ -33,7 +33,15 @@ WINE_DEFAULT_DEBUG_CHANNEL(msvcp);
 DEFINE_THISCALL_WRAPPER(mutex_ctor, 4)
 mutex* __thiscall mutex_ctor(mutex *this)
 {
-    this->mutex = CreateMutexW(NULL, FALSE, NULL);
+    CRITICAL_SECTION *cs = MSVCRT_operator_new(sizeof(*cs));
+    if(!cs) {
+        ERR("Out of memory\n");
+        throw_exception(EXCEPTION_BAD_ALLOC, NULL);
+    }
+
+    InitializeCriticalSection(cs);
+    cs->DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": _Mutex critical section");
+    this->mutex = cs;
     return this;
 }
 
@@ -42,7 +50,9 @@ mutex* __thiscall mutex_ctor(mutex *this)
 DEFINE_THISCALL_WRAPPER(mutex_dtor, 4)
 void __thiscall mutex_dtor(mutex *this)
 {
-    CloseHandle(this->mutex);
+    ((CRITICAL_SECTION*)this->mutex)->DebugInfo->Spare[0] = 0;
+    DeleteCriticalSection(this->mutex);
+    MSVCRT_operator_delete(this->mutex);
 }
 
 /* ?_Lock at _Mutex@std@@QAEXXZ */
@@ -50,7 +60,7 @@ void __thiscall mutex_dtor(mutex *this)
 DEFINE_THISCALL_WRAPPER(mutex_lock, 4)
 void __thiscall mutex_lock(mutex *this)
 {
-    WaitForSingleObject(this->mutex, INFINITE);
+    EnterCriticalSection(this->mutex);
 }
 
 /* ?_Unlock at _Mutex@std@@QAEXXZ */
@@ -58,7 +68,7 @@ void __thiscall mutex_lock(mutex *this)
 DEFINE_THISCALL_WRAPPER(mutex_unlock, 4)
 void __thiscall mutex_unlock(mutex *this)
 {
-    ReleaseMutex(this->mutex);
+    LeaveCriticalSection(this->mutex);
 }
 
 /* ?_Mutex_Lock at _Mutex@std@@CAXPAV12@@Z */
diff --git a/dlls/msvcp100/msvcp.h b/dlls/msvcp100/msvcp.h
index 08c3471..de8d9e3 100644
--- a/dlls/msvcp100/msvcp.h
+++ b/dlls/msvcp100/msvcp.h
@@ -205,7 +205,7 @@ void __thiscall _Lockit_dtor(_Lockit*);
 
 /* class mutex */
 typedef struct {
-        void *mutex;
+    void *mutex;
 } mutex;
 
 mutex* __thiscall mutex_ctor(mutex*);
diff --git a/dlls/msvcp60/misc.c b/dlls/msvcp60/misc.c
index f0796a4..9c840b7 100644
--- a/dlls/msvcp60/misc.c
+++ b/dlls/msvcp60/misc.c
@@ -31,7 +31,13 @@
 /* ??0_Mutex at std@@QEAA at XZ */
 mutex* mutex_ctor(mutex *this)
 {
-    this->mutex = CreateMutexW(NULL, FALSE, NULL);
+    CRITICAL_SECTION *cs = MSVCRT_operator_new(sizeof(*cs));
+    if(!cs)
+        throw_exception(EXCEPTION_BAD_ALLOC, NULL);
+
+    InitializeCriticalSection(cs);
+    cs->DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": _Mutex critical section");
+    this->mutex = cs;
     return this;
 }
 
@@ -39,21 +45,23 @@ mutex* mutex_ctor(mutex *this)
 /* ??1_Mutex at std@@QEAA at XZ */
 void mutex_dtor(mutex *this)
 {
-    CloseHandle(this->mutex);
+    ((CRITICAL_SECTION*)this->mutex)->DebugInfo->Spare[0] = 0;
+    DeleteCriticalSection(this->mutex);
+    MSVCRT_operator_delete(this->mutex);
 }
 
 /* ?_Lock at _Mutex@std@@QAEXXZ */
 /* ?_Lock at _Mutex@std@@QEAAXXZ */
 void mutex_lock(mutex *this)
 {
-    WaitForSingleObject(this->mutex, INFINITE);
+    EnterCriticalSection(this->mutex);
 }
 
 /* ?_Unlock at _Mutex@std@@QAEXXZ */
 /* ?_Unlock at _Mutex@std@@QEAAXXZ */
 void mutex_unlock(mutex *this)
 {
-    ReleaseMutex(this->mutex);
+    LeaveCriticalSection(this->mutex);
 }
 
 static CRITICAL_SECTION lockit_cs;
diff --git a/dlls/msvcp71/misc.c b/dlls/msvcp71/misc.c
index 8615a51..21ca929 100644
--- a/dlls/msvcp71/misc.c
+++ b/dlls/msvcp71/misc.c
@@ -33,7 +33,15 @@ WINE_DEFAULT_DEBUG_CHANNEL(msvcp);
 DEFINE_THISCALL_WRAPPER(mutex_ctor, 4)
 mutex* __thiscall mutex_ctor(mutex *this)
 {
-    this->mutex = CreateMutexW(NULL, FALSE, NULL);
+    CRITICAL_SECTION *cs = MSVCRT_operator_new(sizeof(*cs));
+    if(!cs) {
+        ERR("Out of memory\n");
+        throw_exception(EXCEPTION_BAD_ALLOC, NULL);
+    }
+
+    InitializeCriticalSection(cs);
+    cs->DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": _Mutex critical section");
+    this->mutex = cs;
     return this;
 }
 
@@ -42,7 +50,9 @@ mutex* __thiscall mutex_ctor(mutex *this)
 DEFINE_THISCALL_WRAPPER(mutex_dtor, 4)
 void __thiscall mutex_dtor(mutex *this)
 {
-    CloseHandle(this->mutex);
+    ((CRITICAL_SECTION*)this->mutex)->DebugInfo->Spare[0] = 0;
+    DeleteCriticalSection(this->mutex);
+    MSVCRT_operator_delete(this->mutex);
 }
 
 /* ?_Lock at _Mutex@std@@QAEXXZ */
@@ -50,7 +60,7 @@ void __thiscall mutex_dtor(mutex *this)
 DEFINE_THISCALL_WRAPPER(mutex_lock, 4)
 void __thiscall mutex_lock(mutex *this)
 {
-    WaitForSingleObject(this->mutex, INFINITE);
+    EnterCriticalSection(this->mutex);
 }
 
 /* ?_Unlock at _Mutex@std@@QAEXXZ */
@@ -58,7 +68,7 @@ void __thiscall mutex_lock(mutex *this)
 DEFINE_THISCALL_WRAPPER(mutex_unlock, 4)
 void __thiscall mutex_unlock(mutex *this)
 {
-    ReleaseMutex(this->mutex);
+    LeaveCriticalSection(this->mutex);
 }
 
 static CRITICAL_SECTION lockit_cs[_MAX_LOCK];
diff --git a/dlls/msvcp71/msvcp.h b/dlls/msvcp71/msvcp.h
index aea85cc..6f9e266 100644
--- a/dlls/msvcp71/msvcp.h
+++ b/dlls/msvcp71/msvcp.h
@@ -201,7 +201,7 @@ void __thiscall _Lockit_dtor(_Lockit*);
 
 /* class mutex */
 typedef struct {
-        void *mutex;
+    void *mutex;
 } mutex;
 
 mutex* __thiscall mutex_ctor(mutex*);
diff --git a/dlls/msvcp90/misc.c b/dlls/msvcp90/misc.c
index c8c4122..8b3df21 100644
--- a/dlls/msvcp90/misc.c
+++ b/dlls/msvcp90/misc.c
@@ -33,7 +33,15 @@ WINE_DEFAULT_DEBUG_CHANNEL(msvcp);
 DEFINE_THISCALL_WRAPPER(mutex_ctor, 4)
 mutex* __thiscall mutex_ctor(mutex *this)
 {
-    this->mutex = CreateMutexW(NULL, FALSE, NULL);
+    CRITICAL_SECTION *cs = MSVCRT_operator_new(sizeof(*cs));
+    if(!cs) {
+        ERR("Out of memory\n");
+        throw_exception(EXCEPTION_BAD_ALLOC, NULL);
+    }
+
+    InitializeCriticalSection(cs);
+    cs->DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": _Mutex critical section");
+    this->mutex = cs;
     return this;
 }
 
@@ -42,7 +50,9 @@ mutex* __thiscall mutex_ctor(mutex *this)
 DEFINE_THISCALL_WRAPPER(mutex_dtor, 4)
 void __thiscall mutex_dtor(mutex *this)
 {
-    CloseHandle(this->mutex);
+    ((CRITICAL_SECTION*)this->mutex)->DebugInfo->Spare[0] = 0;
+    DeleteCriticalSection(this->mutex);
+    MSVCRT_operator_delete(this->mutex);
 }
 
 /* ?_Lock at _Mutex@std@@QAEXXZ */
@@ -50,7 +60,7 @@ void __thiscall mutex_dtor(mutex *this)
 DEFINE_THISCALL_WRAPPER(mutex_lock, 4)
 void __thiscall mutex_lock(mutex *this)
 {
-    WaitForSingleObject(this->mutex, INFINITE);
+    EnterCriticalSection(this->mutex);
 }
 
 /* ?_Unlock at _Mutex@std@@QAEXXZ */
@@ -58,7 +68,7 @@ void __thiscall mutex_lock(mutex *this)
 DEFINE_THISCALL_WRAPPER(mutex_unlock, 4)
 void __thiscall mutex_unlock(mutex *this)
 {
-    ReleaseMutex(this->mutex);
+    LeaveCriticalSection(this->mutex);
 }
 
 /* ?_Mutex_Lock at _Mutex@std@@CAXPAV12@@Z */
diff --git a/dlls/msvcp90/msvcp90.h b/dlls/msvcp90/msvcp90.h
index 1108591..2496ebcd 100644
--- a/dlls/msvcp90/msvcp90.h
+++ b/dlls/msvcp90/msvcp90.h
@@ -201,7 +201,7 @@ void __thiscall _Lockit_dtor(_Lockit*);
 
 /* class mutex */
 typedef struct {
-        void *mutex;
+    void *mutex;
 } mutex;
 
 mutex* __thiscall mutex_ctor(mutex*);




More information about the wine-cvs mailing list