From: Paul Gofman <pgofman(a)codeweavers.com> --- dlls/kernel32/kernel32.spec | 2 ++ dlls/ntdll/ntdll.spec | 3 +++ dlls/ntdll/sync.c | 31 +++++++++++++++++++++++++++++++ dlls/ntdll/tests/sync.c | 32 ++++++++++++++++++++++++++++++++ include/winternl.h | 3 +++ 5 files changed, 71 insertions(+) diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 31ed292a6c6..f5c8247636a 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -425,6 +425,7 @@ @ stdcall -import EnumResourceTypesExA(long ptr long long long) @ stdcall -import EnumResourceTypesExW(long ptr long long long) @ stdcall EnumResourceTypesW(long ptr long) +@ stdcall -import EnterSynchronizationBarrier(ptr long) @ stdcall EnumSystemCodePagesA(ptr long) @ stdcall -import EnumSystemCodePagesW(ptr long) @ stdcall -import EnumSystemFirmwareTables(long ptr long) @@ -978,6 +979,7 @@ @ stdcall -import InitializeCriticalSectionAndSpinCount(ptr long) @ stdcall -import InitializeCriticalSectionEx(ptr long long) @ stdcall -import InitializeProcThreadAttributeList(ptr long long ptr) +@ stdcall -import InitializeSynchronizationBarrier(ptr long long) @ stdcall InitializeSListHead(ptr) NTDLL.RtlInitializeSListHead @ stdcall InitializeSRWLock(ptr) NTDLL.RtlInitializeSRWLock @ stdcall -arch=i386 InterlockedCompareExchange (ptr long long) diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index ac4dff7ff40..7ff4f75f55d 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -525,6 +525,7 @@ @ stdcall RtlAreBitsSet(ptr long long) # @ stub RtlAssert2 @ stdcall RtlAssert(ptr ptr long str) +@ stdcall RtlBarrier(ptr long) # @ stub RtlCancelTimer @ stdcall -norelay RtlCaptureContext(ptr) @ stdcall RtlCaptureStackBackTrace(long long ptr ptr) @@ -611,6 +612,7 @@ @ stdcall RtlDelete(ptr) @ stdcall RtlDeleteAce(ptr long) @ stdcall RtlDeleteAtomFromAtomTable(ptr long) +@ stdcall RtlDeleteBarrier(ptr) @ stdcall RtlDeleteCriticalSection(ptr) @ stdcall -arch=!i386 RtlDeleteGrowableFunctionTable(ptr) @ stdcall RtlDeleteElementGenericTable(ptr ptr) @@ -792,6 +794,7 @@ @ stdcall RtlImpersonateSelf(long) @ stdcall RtlInitAnsiString(ptr str) @ stdcall RtlInitAnsiStringEx(ptr str) +@ stdcall RtlInitBarrier(ptr long long) @ stdcall RtlInitCodePageTable(ptr ptr) # @ stub RtlInitMemoryStream @ stdcall RtlInitNlsTables(ptr ptr ptr ptr) diff --git a/dlls/ntdll/sync.c b/dlls/ntdll/sync.c index 1bd62612efe..f9deaf5ce3d 100644 --- a/dlls/ntdll/sync.c +++ b/dlls/ntdll/sync.c @@ -1374,3 +1374,34 @@ void WINAPI RtlDumpResource(LPRTL_RWLOCK rwl) rwl, rwl->iNumberActive, rwl->uSharedWaiters, rwl->uExclusiveWaiters, rwl->hOwningThreadId ); ERR( "\n" ); } + + +/*********************************************************************** + * RtlInitBarrier (NTDLL.@) + */ +NTSTATUS WINAPI RtlInitBarrier( RTL_BARRIER *barrier, LONG thread_count, LONG spin_count ) +{ + FIXME( "barrier %p, thread_count %ld, spin_count %ld stub.\n", barrier, thread_count, spin_count ); + + return STATUS_SUCCESS; +} + + +/*********************************************************************** + * RtlDeleteBarrier (NTDLL.@) + */ +void WINAPI RtlDeleteBarrier( RTL_BARRIER *barrier ) +{ + FIXME( "barrier %p stub.\n", barrier ); +} + + +/*********************************************************************** + * RtlBarrier (NTDLL.@) + */ +BOOLEAN WINAPI RtlBarrier( RTL_BARRIER *barrier, ULONG flags ) +{ + FIXME( "barrier %p, flags %#lx stub.\n", barrier, flags ); + + return TRUE; +} diff --git a/dlls/ntdll/tests/sync.c b/dlls/ntdll/tests/sync.c index a443c581bca..22aaed5405f 100644 --- a/dlls/ntdll/tests/sync.c +++ b/dlls/ntdll/tests/sync.c @@ -58,6 +58,10 @@ static NTSTATUS (WINAPI *pRtlWaitOnAddress)( const void *, const void *, SIZE_T, static void (WINAPI *pRtlWakeAddressAll)( const void * ); static void (WINAPI *pRtlWakeAddressSingle)( const void * ); +static NTSTATUS (WINAPI *pRtlInitBarrier)(RTL_BARRIER*,LONG,LONG); +static void (WINAPI *pRtlDeleteBarrier)(RTL_BARRIER*); +static BOOLEAN (WINAPI *pRtlBarrier)(RTL_BARRIER*,ULONG); + #define KEYEDEVENT_WAIT 0x0001 #define KEYEDEVENT_WAKE 0x0002 #define KEYEDEVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x0003) @@ -1134,6 +1138,30 @@ static void test_delayexecution(void) } } +static void test_barrier(void) +{ + RTL_BARRIER barrier; + NTSTATUS status; + BOOLEAN bval; + + if (!pRtlInitBarrier) + { + win_skip("RtlInitBarrier is not available.\n"); + return; + } + + status = pRtlInitBarrier( &barrier, 1, -1 ); + ok( !status, "got %#lx.\n", status ); + + bval = pRtlBarrier( &barrier, 0 ); + ok( bval == 1, "got %#x.\n", bval ); + + bval = pRtlBarrier( &barrier, 0 ); + ok( bval == 1, "got %#x.\n", bval ); + + pRtlDeleteBarrier( &barrier ); +} + START_TEST(sync) { HMODULE module = GetModuleHandleA("ntdll.dll"); @@ -1175,6 +1203,9 @@ START_TEST(sync) pRtlWaitOnAddress = (void *)GetProcAddress(module, "RtlWaitOnAddress"); pRtlWakeAddressAll = (void *)GetProcAddress(module, "RtlWakeAddressAll"); pRtlWakeAddressSingle = (void *)GetProcAddress(module, "RtlWakeAddressSingle"); + pRtlInitBarrier = (void *)GetProcAddress(module, "RtlInitBarrier"); + pRtlDeleteBarrier = (void *)GetProcAddress(module, "RtlDeleteBarrier"); + pRtlBarrier = (void *)GetProcAddress(module, "RtlBarrier"); test_wait_on_address(); test_event(); @@ -1185,4 +1216,5 @@ START_TEST(sync) test_tid_alert( argv ); test_completion_port_scheduling(); test_delayexecution(); + test_barrier(); } diff --git a/include/winternl.h b/include/winternl.h index 2c985465096..d94b9911c74 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -4823,6 +4823,7 @@ NTSYSAPI BOOLEAN WINAPI RtlAreAllAccessesGranted(ACCESS_MASK,ACCESS_MASK); NTSYSAPI BOOLEAN WINAPI RtlAreAnyAccessesGranted(ACCESS_MASK,ACCESS_MASK); NTSYSAPI BOOLEAN WINAPI RtlAreBitsSet(PCRTL_BITMAP,ULONG,ULONG); NTSYSAPI BOOLEAN WINAPI RtlAreBitsClear(PCRTL_BITMAP,ULONG,ULONG); +NTSYSAPI BOOLEAN WINAPI RtlBarrier(RTL_BARRIER*,ULONG); NTSYSAPI NTSTATUS WINAPI RtlCharToInteger(PCSZ,ULONG,PULONG); NTSYSAPI NTSTATUS WINAPI RtlCheckRegistryKey(ULONG, PWSTR); NTSYSAPI void WINAPI RtlClearAllBits(PRTL_BITMAP); @@ -4868,6 +4869,7 @@ NTSYSAPI NTSTATUS WINAPI RtlDecompressFragment(USHORT,PUCHAR,ULONG,PUCHAR,ULONG NTSYSAPI NTSTATUS WINAPI RtlDefaultNpAcl(PACL*); NTSYSAPI NTSTATUS WINAPI RtlDeleteAce(PACL,DWORD); NTSYSAPI NTSTATUS WINAPI RtlDeleteAtomFromAtomTable(RTL_ATOM_TABLE,RTL_ATOM); +NTSYSAPI void WINAPI RtlDeleteBarrier(RTL_BARRIER*); NTSYSAPI NTSTATUS WINAPI RtlDeleteCriticalSection(RTL_CRITICAL_SECTION *); NTSYSAPI NTSTATUS WINAPI RtlDeleteRegistryValue(ULONG, PCWSTR, PCWSTR); NTSYSAPI void WINAPI RtlDeleteResource(LPRTL_RWLOCK); @@ -5000,6 +5002,7 @@ NTSYSAPI PVOID WINAPI RtlImageRvaToVa(const IMAGE_NT_HEADERS *,HMODULE,DWORD NTSYSAPI NTSTATUS WINAPI RtlImpersonateSelf(SECURITY_IMPERSONATION_LEVEL); NTSYSAPI void WINAPI RtlInitAnsiString(PANSI_STRING,PCSZ); NTSYSAPI NTSTATUS WINAPI RtlInitAnsiStringEx(PANSI_STRING,PCSZ); +NTSYSAPI NTSTATUS WINAPI RtlInitBarrier(RTL_BARRIER*,LONG,LONG); NTSYSAPI void WINAPI RtlInitCodePageTable(USHORT*,CPTABLEINFO*); NTSYSAPI void WINAPI RtlInitNlsTables(USHORT*,USHORT*,USHORT*,NLSTABLEINFO*); NTSYSAPI void WINAPI RtlInitString(PSTRING,PCSZ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9267