Piotr Caban : msvcp90: Added _Lockit class implementation.
Module: wine Branch: master Commit: b8606c82ee82fbceb5b7d77f76178e69ec1642eb URL: http://source.winehq.org/git/wine.git/?a=commit;h=b8606c82ee82fbceb5b7d77f76... Author: Piotr Caban <piotr(a)codeweavers.com> Date: Wed Jun 22 14:03:54 2011 +0200 msvcp90: Added _Lockit class implementation. --- dlls/msvcp90/misc.c | 82 +++++++++++++++++++++++++++++++++++++++++++ dlls/msvcp90/msvcp90.h | 8 ++++ dlls/msvcp90/msvcp90.spec | 28 +++++++------- dlls/msvcp90/msvcp90_main.c | 2 + 4 files changed, 106 insertions(+), 14 deletions(-) diff --git a/dlls/msvcp90/misc.c b/dlls/msvcp90/misc.c index 8f7a835..f0d1923 100644 --- a/dlls/msvcp90/misc.c +++ b/dlls/msvcp90/misc.c @@ -90,3 +90,85 @@ void CDECL mutex_mutex_dtor(mutex *m) { mutex_dtor(m); } + +#define _LOCK_LOCALE 0 +#define _LOCK_MALLOC 1 +#define _LOCK_STREAM 2 +#define _LOCK_DEBUG 3 +#define _MAX_LOCK 4 +static CRITICAL_SECTION lockit_cs[_MAX_LOCK]; + +/* ?_Lockit_ctor(a)_Lockit@std@@SAXH(a)Z */ +void __cdecl _Lockit_init(int locktype) { + InitializeCriticalSection(&lockit_cs[locktype]); + lockit_cs[locktype].DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": _Lockit critical section"); +} + +/* ?_Lockit_dtor(a)_Lockit@std@@SAXH(a)Z */ +void __cdecl _Lockit_free(int locktype) +{ + lockit_cs[locktype].DebugInfo->Spare[0] = (DWORD_PTR)0; + DeleteCriticalSection(&lockit_cs[locktype]); +} + +void init_lockit(void) { + int i; + + for(i=0; i<_MAX_LOCK; i++) + _Lockit_init(i); +} + +void free_lockit(void) { + int i; + + for(i=0; i<_MAX_LOCK; i++) + _Lockit_free(i); +} + +/* ?_Lockit_ctor(a)_Lockit@std@@CAXPAV12(a)H@Z */ +/* ?_Lockit_ctor(a)_Lockit@std@@CAXPEAV12(a)H@Z */ +void __cdecl _Lockit__Lockit_ctor_locktype(_Lockit *lockit, int locktype) +{ + lockit->locktype = locktype; + EnterCriticalSection(&lockit_cs[locktype]); +} + +/* ?_Lockit_ctor(a)_Lockit@std@@CAXPAV12@@Z */ +/* ?_Lockit_ctor(a)_Lockit@std@@CAXPEAV12@@Z */ +void __cdecl _Lockit__Lockit_ctor(_Lockit *lockit) +{ + _Lockit__Lockit_ctor_locktype(lockit, 0); +} + +/* ??0_Lockit(a)std@@QAE(a)H@Z */ +/* ??0_Lockit(a)std@@QEAA(a)H@Z */ +DEFINE_THISCALL_WRAPPER(_Lockit_ctor_locktype, 8) +_Lockit* __thiscall _Lockit_ctor_locktype(_Lockit *this, int locktype) +{ + _Lockit__Lockit_ctor_locktype(this, locktype); + return this; +} + +/* ??0_Lockit(a)std@@QAE(a)XZ */ +/* ??0_Lockit(a)std@@QEAA(a)XZ */ +DEFINE_THISCALL_WRAPPER(_Lockit_ctor, 4) +_Lockit* __thiscall _Lockit_ctor(_Lockit *this) +{ + _Lockit__Lockit_ctor_locktype(this, 0); + return this; +} + +/* ?_Lockit_dtor(a)_Lockit@std@@CAXPAV12@@Z */ +/* ?_Lockit_dtor(a)_Lockit@std@@CAXPEAV12@@Z */ +void __cdecl _Lockit__Lockit_dtor(_Lockit *lockit) +{ + LeaveCriticalSection(&lockit_cs[lockit->locktype]); +} + +/* ??1_Lockit(a)std@@QAE(a)XZ */ +/* ??1_Lockit(a)std@@QEAA(a)XZ */ +DEFINE_THISCALL_WRAPPER(_Lockit_dtor, 4) +void __thiscall _Lockit_dtor(_Lockit *this) +{ + _Lockit__Lockit_dtor(this); +} diff --git a/dlls/msvcp90/msvcp90.h b/dlls/msvcp90/msvcp90.h index d94bc6f..9c9e337 100644 --- a/dlls/msvcp90/msvcp90.h +++ b/dlls/msvcp90/msvcp90.h @@ -193,3 +193,11 @@ typedef struct { struct locale__Locimp *ptr; } locale; + +/* class _Lockit */ +typedef struct { + int locktype; +} _Lockit; + +void init_lockit(void); +void free_lockit(void); diff --git a/dlls/msvcp90/msvcp90.spec b/dlls/msvcp90/msvcp90.spec index 3dfe4d2..0da53e9 100644 --- a/dlls/msvcp90/msvcp90.spec +++ b/dlls/msvcp90/msvcp90.spec @@ -1078,10 +1078,10 @@ @ stub -arch=win64 ??0_Locinfo(a)std@@QEAA(a)HPEBD@Z @ stub -arch=win32 ??0_Locinfo(a)std@@QAE(a)PBD@Z @ stub -arch=win64 ??0_Locinfo(a)std@@QEAA(a)PEBD@Z -@ stub -arch=win32 ??0_Lockit(a)std@@QAE(a)H@Z -@ stub -arch=win64 ??0_Lockit(a)std@@QEAA(a)H@Z -@ stub -arch=win32 ??0_Lockit(a)std@@QAE(a)XZ -@ stub -arch=win64 ??0_Lockit(a)std@@QEAA(a)XZ +@ thiscall -arch=win32 ??0_Lockit(a)std@@QAE(a)H@Z(ptr long) _Lockit_ctor_locktype +@ cdecl -arch=win64 ??0_Lockit(a)std@@QEAA(a)H@Z(ptr long) _Lockit_ctor_locktype +@ thiscall -arch=win32 ??0_Lockit(a)std@@QAE(a)XZ(ptr) _Lockit_ctor +@ cdecl -arch=win64 ??0_Lockit(a)std@@QEAA(a)XZ(ptr) _Lockit_ctor @ thiscall -arch=win32 ??0_Mutex(a)std@@QAE(a)XZ(ptr) mutex_ctor @ cdecl -arch=win64 ??0_Mutex(a)std@@QEAA(a)XZ(ptr) mutex_ctor @ stub -arch=win32 ??0_Timevec(a)std@@QAE(a)ABV01@@Z @@ -1316,8 +1316,8 @@ @ cdecl -arch=win64 ??1_Locimp(a)locale@std@@MEAA(a)XZ(ptr) locale__Locimp_dtor @ stub -arch=win32 ??1_Locinfo(a)std@@QAE(a)XZ @ stub -arch=win64 ??1_Locinfo(a)std@@QEAA(a)XZ -@ stub -arch=win32 ??1_Lockit(a)std@@QAE(a)XZ -@ stub -arch=win64 ??1_Lockit(a)std@@QEAA(a)XZ +@ thiscall -arch=win32 ??1_Lockit(a)std@@QAE(a)XZ(ptr) _Lockit_dtor +@ cdecl -arch=win64 ??1_Lockit(a)std@@QEAA(a)XZ(ptr) _Lockit_dtor @ thiscall -arch=win32 ??1_Mutex(a)std@@QAE(a)XZ(ptr) mutex_dtor @ cdecl -arch=win64 ??1_Mutex(a)std@@QEAA(a)XZ(ptr) mutex_dtor @ stub -arch=win32 ??1_Timevec(a)std@@QAE(a)XZ @@ -2599,14 +2599,14 @@ @ stub -arch=win64 ?_Lock@?$basic_streambuf(a)_WU?$char_traits(a)_W@std@@@std@@QEAAXXZ @ thiscall -arch=win32 ?_Lock(a)_Mutex@std@@QAEXXZ(ptr) mutex_lock @ cdecl -arch=win64 ?_Lock(a)_Mutex@std@@QEAAXXZ(ptr) mutex_lock -@ stub -arch=win32 ?_Lockit_ctor(a)_Lockit@std@@CAXPAV12@@Z -@ stub -arch=win64 ?_Lockit_ctor(a)_Lockit@std@@CAXPEAV12@@Z -@ stub -arch=win32 ?_Lockit_ctor(a)_Lockit@std@@CAXPAV12(a)H@Z -@ stub -arch=win64 ?_Lockit_ctor(a)_Lockit@std@@CAXPEAV12(a)H@Z -@ stub ?_Lockit_ctor(a)_Lockit@std@@SAXH(a)Z -@ stub -arch=win32 ?_Lockit_dtor(a)_Lockit@std@@CAXPAV12@@Z -@ stub -arch=win64 ?_Lockit_dtor(a)_Lockit@std@@CAXPEAV12@@Z -@ stub ?_Lockit_dtor(a)_Lockit@std@@SAXH(a)Z +@ cdecl -arch=win32 ?_Lockit_ctor(a)_Lockit@std@@CAXPAV12@@Z(ptr) _Lockit__Lockit_ctor +@ cdecl -arch=win64 ?_Lockit_ctor(a)_Lockit@std@@CAXPEAV12@@Z(ptr) _Lockit__Lockit_ctor +@ cdecl -arch=win32 ?_Lockit_ctor(a)_Lockit@std@@CAXPAV12(a)H@Z(ptr long) _Lockit__Lockit_ctor_locktype +@ cdecl -arch=win64 ?_Lockit_ctor(a)_Lockit@std@@CAXPEAV12(a)H@Z(ptr long) _Lockit__Lockit_ctor_locktype +@ cdecl ?_Lockit_ctor(a)_Lockit@std@@SAXH(a)Z(long) _Lockit_init +@ cdecl -arch=win32 ?_Lockit_dtor(a)_Lockit@std@@CAXPAV12@@Z(ptr) _Lockit__Lockit_dtor +@ cdecl -arch=win64 ?_Lockit_dtor(a)_Lockit@std@@CAXPEAV12@@Z(ptr) _Lockit__Lockit_dtor +@ cdecl ?_Lockit_dtor(a)_Lockit@std@@SAXH(a)Z(long) _Lockit_free @ stub -arch=win32 ?_MP_Add(a)tr1@std@@YAXQA_K_K(a)Z @ stub -arch=win64 ?_MP_Add(a)tr1@std@@YAXQEA_K_K(a)Z @ stub -arch=win32 ?_MP_Get(a)tr1@std@@YA_KQA_K(a)Z diff --git a/dlls/msvcp90/msvcp90_main.c b/dlls/msvcp90/msvcp90_main.c index 5dd4471..f9c508a 100644 --- a/dlls/msvcp90/msvcp90_main.c +++ b/dlls/msvcp90/msvcp90_main.c @@ -57,8 +57,10 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) case DLL_PROCESS_ATTACH: init_cxx_funcs(); set_exception_vtable(); + init_lockit(); break; case DLL_PROCESS_DETACH: + free_lockit(); break; }
participants (1)
-
Alexandre Julliard