Module: wine Branch: master Commit: b0e4fd05e57100ce8d2275560eefb9a9d83ccef9 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b0e4fd05e57100ce8d2275560e...
Author: Sebastian Lackner sebastian@fds-team.de Date: Fri Aug 7 08:22:51 2015 +0200
vcomp: Implement _vcomp_enter_critsect and _vcomp_leave_critsect.
---
dlls/vcomp/main.c | 34 ++++++++++++++++++++++++++++++++++ dlls/vcomp/vcomp.spec | 4 ++-- dlls/vcomp100/vcomp100.spec | 4 ++-- dlls/vcomp110/vcomp110.spec | 4 ++-- dlls/vcomp90/vcomp90.spec | 4 ++-- 5 files changed, 42 insertions(+), 8 deletions(-)
diff --git a/dlls/vcomp/main.c b/dlls/vcomp/main.c index 1d9765f..10ac465 100644 --- a/dlls/vcomp/main.c +++ b/dlls/vcomp/main.c @@ -979,6 +979,40 @@ void WINAPIV _vcomp_fork(BOOL ifval, int nargs, void *wrapper, ...) __ms_va_end(team_data.valist); }
+void CDECL _vcomp_enter_critsect(CRITICAL_SECTION **critsect) +{ + TRACE("(%p)\n", critsect); + + if (!*critsect) + { + CRITICAL_SECTION *new_critsect; + if (!(new_critsect = HeapAlloc(GetProcessHeap(), 0, sizeof(*new_critsect)))) + { + ERR("could not allocate critical section\n"); + ExitProcess(1); + } + + InitializeCriticalSection(new_critsect); + new_critsect->DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": critsect"); + + if (interlocked_cmpxchg_ptr((void **)critsect, new_critsect, NULL) != NULL) + { + /* someone beat us to it */ + new_critsect->DebugInfo->Spare[0] = 0; + DeleteCriticalSection(new_critsect); + HeapFree(GetProcessHeap(), 0, new_critsect); + } + } + + EnterCriticalSection(*critsect); +} + +void CDECL _vcomp_leave_critsect(CRITICAL_SECTION *critsect) +{ + TRACE("(%p)\n", critsect); + LeaveCriticalSection(critsect); +} + BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) { TRACE("(%p, %d, %p)\n", instance, reason, reserved); diff --git a/dlls/vcomp/vcomp.spec b/dlls/vcomp/vcomp.spec index 3167839..55b699f 100644 --- a/dlls/vcomp/vcomp.spec +++ b/dlls/vcomp/vcomp.spec @@ -53,7 +53,7 @@ @ cdecl _vcomp_barrier() @ stub _vcomp_copyprivate_broadcast @ stub _vcomp_copyprivate_receive -@ stub _vcomp_enter_critsect +@ cdecl _vcomp_enter_critsect(ptr) @ stub _vcomp_flush @ cdecl _vcomp_for_dynamic_init(long long long long long) @ stub _vcomp_for_dynamic_init_i8 @@ -66,7 +66,7 @@ @ stub _vcomp_for_static_simple_init_i8 @ varargs _vcomp_fork(long long ptr) @ stub _vcomp_get_thread_num -@ stub _vcomp_leave_critsect +@ cdecl _vcomp_leave_critsect(ptr) @ stub _vcomp_master_barrier @ cdecl _vcomp_master_begin() @ cdecl _vcomp_master_end() diff --git a/dlls/vcomp100/vcomp100.spec b/dlls/vcomp100/vcomp100.spec index 38578b9..7bf6238 100644 --- a/dlls/vcomp100/vcomp100.spec +++ b/dlls/vcomp100/vcomp100.spec @@ -53,7 +53,7 @@ @ cdecl _vcomp_barrier() vcomp._vcomp_barrier @ stub _vcomp_copyprivate_broadcast @ stub _vcomp_copyprivate_receive -@ stub _vcomp_enter_critsect +@ cdecl _vcomp_enter_critsect(ptr) vcomp._vcomp_enter_critsect @ stub _vcomp_flush @ cdecl _vcomp_for_dynamic_init(long long long long long) vcomp._vcomp_for_dynamic_init @ stub _vcomp_for_dynamic_init_i8 @@ -66,7 +66,7 @@ @ stub _vcomp_for_static_simple_init_i8 @ varargs _vcomp_fork(long long ptr) vcomp._vcomp_fork @ stub _vcomp_get_thread_num -@ stub _vcomp_leave_critsect +@ cdecl _vcomp_leave_critsect(ptr) vcomp._vcomp_leave_critsect @ stub _vcomp_master_barrier @ cdecl _vcomp_master_begin() vcomp._vcomp_master_begin @ cdecl _vcomp_master_end() vcomp._vcomp_master_end diff --git a/dlls/vcomp110/vcomp110.spec b/dlls/vcomp110/vcomp110.spec index ef8222f..c84e44c 100644 --- a/dlls/vcomp110/vcomp110.spec +++ b/dlls/vcomp110/vcomp110.spec @@ -54,7 +54,7 @@ @ cdecl _vcomp_barrier() vcomp._vcomp_barrier @ stub _vcomp_copyprivate_broadcast @ stub _vcomp_copyprivate_receive -@ stub _vcomp_enter_critsect +@ cdecl _vcomp_enter_critsect(ptr) vcomp._vcomp_enter_critsect @ stub _vcomp_flush @ cdecl _vcomp_for_dynamic_init(long long long long long) vcomp._vcomp_for_dynamic_init @ stub _vcomp_for_dynamic_init_i8 @@ -67,7 +67,7 @@ @ stub _vcomp_for_static_simple_init_i8 @ varargs _vcomp_fork(long long ptr) vcomp._vcomp_fork @ stub _vcomp_get_thread_num -@ stub _vcomp_leave_critsect +@ cdecl _vcomp_leave_critsect(ptr) vcomp._vcomp_leave_critsect @ stub _vcomp_master_barrier @ cdecl _vcomp_master_begin() vcomp._vcomp_master_begin @ cdecl _vcomp_master_end() vcomp._vcomp_master_end diff --git a/dlls/vcomp90/vcomp90.spec b/dlls/vcomp90/vcomp90.spec index 38578b9..7bf6238 100644 --- a/dlls/vcomp90/vcomp90.spec +++ b/dlls/vcomp90/vcomp90.spec @@ -53,7 +53,7 @@ @ cdecl _vcomp_barrier() vcomp._vcomp_barrier @ stub _vcomp_copyprivate_broadcast @ stub _vcomp_copyprivate_receive -@ stub _vcomp_enter_critsect +@ cdecl _vcomp_enter_critsect(ptr) vcomp._vcomp_enter_critsect @ stub _vcomp_flush @ cdecl _vcomp_for_dynamic_init(long long long long long) vcomp._vcomp_for_dynamic_init @ stub _vcomp_for_dynamic_init_i8 @@ -66,7 +66,7 @@ @ stub _vcomp_for_static_simple_init_i8 @ varargs _vcomp_fork(long long ptr) vcomp._vcomp_fork @ stub _vcomp_get_thread_num -@ stub _vcomp_leave_critsect +@ cdecl _vcomp_leave_critsect(ptr) vcomp._vcomp_leave_critsect @ stub _vcomp_master_barrier @ cdecl _vcomp_master_begin() vcomp._vcomp_master_begin @ cdecl _vcomp_master_end() vcomp._vcomp_master_end