Paul Gofman : kernelbase: Move FlsFree() implementation to ntdll.RtlFlsFree().
Alexandre Julliard
julliard at winehq.org
Thu Oct 1 15:50:29 CDT 2020
Module: wine
Branch: master
Commit: 0627fa9d9217c18278c8ea9c96740815b70d850f
URL: https://source.winehq.org/git/wine.git/?a=commit;h=0627fa9d9217c18278c8ea9c96740815b70d850f
Author: Paul Gofman <pgofman at codeweavers.com>
Date: Tue Sep 29 23:15:30 2020 +0300
kernelbase: Move FlsFree() implementation to ntdll.RtlFlsFree().
Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernel32/tests/fiber.c | 8 ++++++--
dlls/kernelbase/thread.c | 15 +--------------
dlls/ntdll/ntdll.spec | 1 +
dlls/ntdll/thread.c | 24 +++++++++++++++++++++++-
include/winternl.h | 1 +
5 files changed, 32 insertions(+), 17 deletions(-)
diff --git a/dlls/kernel32/tests/fiber.c b/dlls/kernel32/tests/fiber.c
index b058dae749..0304dcfcde 100644
--- a/dlls/kernel32/tests/fiber.c
+++ b/dlls/kernel32/tests/fiber.c
@@ -38,7 +38,7 @@ static BOOL (WINAPI *pFlsFree)(DWORD);
static PVOID (WINAPI *pFlsGetValue)(DWORD);
static BOOL (WINAPI *pFlsSetValue)(DWORD,PVOID);
static NTSTATUS (WINAPI *pRtlFlsAlloc)(PFLS_CALLBACK_FUNCTION,DWORD*);
-
+static NTSTATUS (WINAPI *pRtlFlsFree)(ULONG);
static void *fibers[3];
static BYTE testparam = 185;
static DWORD fls_index_to_set = FLS_OUT_OF_INDEXES;
@@ -69,6 +69,7 @@ static VOID init_funcs(void)
#define X(f) p##f = (void*)GetProcAddress(hntdll, #f);
X(RtlFlsAlloc);
+ X(RtlFlsFree);
#undef X
}
@@ -218,7 +219,10 @@ static void test_FiberLocalStorage(void)
ok(count && (count <= 127 || (count > 4000 && count < 4096)), "Got unexpected count %u.\n", count);
for (i = 0; i < count; ++i)
- pFlsFree(fls_indices[i]);
+ {
+ status = pRtlFlsFree(fls_indices[i]);
+ ok(!status, "Got unexpected status %#x.\n", status);
+ }
}
else
{
diff --git a/dlls/kernelbase/thread.c b/dlls/kernelbase/thread.c
index c302bbd1b8..bce77787ef 100644
--- a/dlls/kernelbase/thread.c
+++ b/dlls/kernelbase/thread.c
@@ -1077,20 +1077,7 @@ DWORD WINAPI DECLSPEC_HOTPATCH FlsAlloc( PFLS_CALLBACK_FUNCTION callback )
*/
BOOL WINAPI DECLSPEC_HOTPATCH FlsFree( DWORD index )
{
- BOOL ret;
-
- RtlAcquirePebLock();
- ret = RtlAreBitsSet( NtCurrentTeb()->Peb->FlsBitmap, index, 1 );
- if (ret) RtlClearBits( NtCurrentTeb()->Peb->FlsBitmap, index, 1 );
- if (ret)
- {
- /* FIXME: call Fls callback */
- /* FIXME: add equivalent of ThreadZeroTlsCell here */
- if (NtCurrentTeb()->FlsSlots) NtCurrentTeb()->FlsSlots[index] = 0;
- }
- else SetLastError( ERROR_INVALID_PARAMETER );
- RtlReleasePebLock();
- return ret;
+ return set_ntstatus( RtlFlsFree( index ));
}
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index aac2af26f3..5cf7e31b01 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -667,6 +667,7 @@
@ stdcall RtlFirstEntrySList(ptr)
@ stdcall RtlFirstFreeAce(ptr ptr)
@ stdcall RtlFlsAlloc(ptr ptr)
+@ stdcall RtlFlsFree(long)
@ stub RtlFlushPropertySet
# @ stub RtlFlushSecureMemoryCache
@ stdcall RtlFormatCurrentUserKeyPath(ptr)
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index f277a52dc0..bbec1f9872 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -256,7 +256,7 @@ TEB_ACTIVE_FRAME * WINAPI RtlGetFrame(void)
/***********************************************************************
* RtlFlsAlloc (NTDLL.@)
*/
-NTSTATUS WINAPI DECLSPEC_HOTPATCH RtlFlsAlloc( PFLS_CALLBACK_FUNCTION callback, DWORD *ret_index )
+NTSTATUS WINAPI DECLSPEC_HOTPATCH RtlFlsAlloc( PFLS_CALLBACK_FUNCTION callback, ULONG *ret_index )
{
PEB * const peb = NtCurrentTeb()->Peb;
NTSTATUS status = STATUS_NO_MEMORY;
@@ -289,3 +289,25 @@ NTSTATUS WINAPI DECLSPEC_HOTPATCH RtlFlsAlloc( PFLS_CALLBACK_FUNCTION callback,
*ret_index = index;
return status;
}
+
+
+/***********************************************************************
+ * RtlFlsFree (NTDLL.@)
+ */
+NTSTATUS WINAPI DECLSPEC_HOTPATCH RtlFlsFree( ULONG index )
+{
+ NTSTATUS status;
+
+ RtlAcquirePebLock();
+ if (RtlAreBitsSet( NtCurrentTeb()->Peb->FlsBitmap, index, 1 ))
+ {
+ RtlClearBits( NtCurrentTeb()->Peb->FlsBitmap, index, 1 );
+ /* FIXME: call Fls callback */
+ /* FIXME: add equivalent of ThreadZeroTlsCell here */
+ if (NtCurrentTeb()->FlsSlots) NtCurrentTeb()->FlsSlots[index] = 0;
+ status = STATUS_SUCCESS;
+ }
+ else status = STATUS_INVALID_PARAMETER;
+ RtlReleasePebLock();
+ return status;
+}
diff --git a/include/winternl.h b/include/winternl.h
index ba9d944259..117d34bbfd 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -3372,6 +3372,7 @@ NTSYSAPI ULONG WINAPI RtlFindSetBitsAndClear(PRTL_BITMAP,ULONG,ULONG);
NTSYSAPI ULONG WINAPI RtlFindSetRuns(PCRTL_BITMAP,PRTL_BITMAP_RUN,ULONG,BOOLEAN);
NTSYSAPI BOOLEAN WINAPI RtlFirstFreeAce(PACL,PACE_HEADER *);
NTSYSAPI NTSTATUS WINAPI RtlFlsAlloc(PFLS_CALLBACK_FUNCTION,ULONG *);
+NTSYSAPI NTSTATUS WINAPI RtlFlsFree(ULONG);
NTSYSAPI NTSTATUS WINAPI RtlFormatCurrentUserKeyPath(PUNICODE_STRING);
NTSYSAPI NTSTATUS WINAPI RtlFormatMessage(LPCWSTR,ULONG,BOOLEAN,BOOLEAN,BOOLEAN,__ms_va_list *,LPWSTR,ULONG,ULONG*);
NTSYSAPI NTSTATUS WINAPI RtlFormatMessageEx(LPCWSTR,ULONG,BOOLEAN,BOOLEAN,BOOLEAN,__ms_va_list *,LPWSTR,ULONG,ULONG*,ULONG);
More information about the wine-cvs
mailing list