From 1992f5005c9765bbf648ac884c8a7f9bfdaa929d Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 28 Aug 2013 21:11:00 +0200 Subject: [PATCH] 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 c9a4b5dbf59..c0eda7147c9 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 a8133d45e6b..5cb8e3f8a8b 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 4cbb1328edb..a040c59a9f0 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; } -- 2.11.4.GIT