Module: wine Branch: master Commit: 1992f5005c9765bbf648ac884c8a7f9bfdaa929d URL: http://source.winehq.org/git/wine.git/?a=commit;h=1992f5005c9765bbf648ac884c...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Aug 28 21:11:00 2013 +0200
kernel32: Implement the InitOnce functions.
---
dlls/kernel32/kernel32.spec | 7 +++++-- dlls/kernel32/sync.c | 29 +++++++++++++++++++++++++++++ dlls/kernel32/tests/sync.c | 2 +- 3 files changed, 35 insertions(+), 3 deletions(-)
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index c9a4b5d..c0eda71 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -745,12 +745,15 @@ @ stdcall IdnToNameprepUnicode(long wstr long ptr long) @ stdcall IdnToUnicode(long wstr long ptr long) @ stdcall InitAtomTable(long) -@ stdcall InitializeSRWLock(ptr) +@ stdcall InitOnceBeginInitialize(ptr long ptr ptr) +@ stdcall InitOnceComplete(ptr long ptr) +@ stdcall InitOnceExecuteOnce(ptr ptr ptr ptr) +@ stdcall InitOnceInitialize(ptr) ntdll.RtlRunOnceInitialize @ stdcall InitializeCriticalSection(ptr) @ stdcall InitializeCriticalSectionAndSpinCount(ptr long) @ stdcall InitializeCriticalSectionEx(ptr long long) @ stdcall InitializeSListHead(ptr) ntdll.RtlInitializeSListHead -@ stdcall InitOnceInitialize(ptr) ntdll.RtlRunOnceInitialize +@ stdcall InitializeSRWLock(ptr) @ stdcall -arch=i386 InterlockedCompareExchange (ptr long long) @ stdcall -arch=i386 -ret64 InterlockedCompareExchange64(ptr int64 int64) ntdll.RtlInterlockedCompareExchange64 @ stdcall -arch=i386 InterlockedDecrement(ptr) diff --git a/dlls/kernel32/sync.c b/dlls/kernel32/sync.c index a8133d4..5cb8e3f 100644 --- a/dlls/kernel32/sync.c +++ b/dlls/kernel32/sync.c @@ -2237,6 +2237,35 @@ BOOL WINAPI QueryMemoryResourceNotification(HANDLE handle, PBOOL state) return FALSE; }
+/*********************************************************************** + * InitOnceBeginInitialize (KERNEL32.@) + */ +BOOL WINAPI InitOnceBeginInitialize( INIT_ONCE *once, DWORD flags, BOOL *pending, void **context ) +{ + NTSTATUS status = RtlRunOnceBeginInitialize( once, flags, context ); + if (status >= 0) *pending = (status == STATUS_PENDING); + else SetLastError( RtlNtStatusToDosError(status) ); + return status >= 0; +} + +/*********************************************************************** + * InitOnceComplete (KERNEL32.@) + */ +BOOL WINAPI InitOnceComplete( INIT_ONCE *once, DWORD flags, void *context ) +{ + NTSTATUS status = RtlRunOnceComplete( once, flags, context ); + if (status != STATUS_SUCCESS) SetLastError( RtlNtStatusToDosError(status) ); + return !status; +} + +/*********************************************************************** + * InitOnceExecuteOnce (KERNEL32.@) + */ +BOOL WINAPI InitOnceExecuteOnce( INIT_ONCE *once, PINIT_ONCE_FN func, void *param, void **context ) +{ + return !RtlRunOnceExecuteOnce( once, (PRTL_RUN_ONCE_INIT_FN)func, param, context ); +} + #ifdef __i386__
/*********************************************************************** diff --git a/dlls/kernel32/tests/sync.c b/dlls/kernel32/tests/sync.c index 4cbb132..a040c59 100644 --- a/dlls/kernel32/tests/sync.c +++ b/dlls/kernel32/tests/sync.c @@ -1164,7 +1164,7 @@ static void test_initonce(void)
if (!pInitOnceInitialize || !pInitOnceExecuteOnce) { - todo_wine win_skip("one-time initialization API not supported\n"); + win_skip("one-time initialization API not supported\n"); return; }