kernel32: Call Fls callback (try 2)

André Hentschel nerv at dawncrow.de
Mon May 30 14:42:16 CDT 2011


moved the callback out of the peblock
---
 dlls/kernel32/fiber.c       |   12 ++++++++----
 dlls/kernel32/tests/fiber.c |    2 +-
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/dlls/kernel32/fiber.c b/dlls/kernel32/fiber.c
index ca4c8f9..1e1b4d2 100644
--- a/dlls/kernel32/fiber.c
+++ b/dlls/kernel32/fiber.c
@@ -259,18 +259,22 @@ DWORD WINAPI FlsAlloc( PFLS_CALLBACK_FUNCTION callback )
 BOOL WINAPI FlsFree( DWORD index )
 {
     BOOL ret;
+    PFLS_CALLBACK_FUNCTION callback = NULL;
 
     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;
+        RtlClearBits( NtCurrentTeb()->Peb->FlsBitmap, index, 1 );
+        callback = NtCurrentTeb()->Peb->FlsCallback[index];
     }
     else SetLastError( ERROR_INVALID_PARAMETER );
     RtlReleasePebLock();
+
+    if (ret && callback) callback(NtCurrentTeb()->FlsSlots[index]);
+    /* FIXME: add equivalent of ThreadZeroTlsCell here */
+    if (NtCurrentTeb()->FlsSlots) NtCurrentTeb()->FlsSlots[index] = 0;
+
     return ret;
 }
 
diff --git a/dlls/kernel32/tests/fiber.c b/dlls/kernel32/tests/fiber.c
index 0e68535..7a18fe7 100644
--- a/dlls/kernel32/tests/fiber.c
+++ b/dlls/kernel32/tests/fiber.c
@@ -180,7 +180,7 @@ static void test_FiberLocalStorage(PFLS_CALLBACK_FUNCTION cbfunc)
     ret = pFlsFree(fls);
     ok(ret, "FlsFree failed\n");
     if (cbfunc)
-        todo_wine ok(cbCount == 1, "Wrong callback count: %d\n", cbCount);
+        ok(cbCount == 1, "Wrong callback count: %d\n", cbCount);
 }
 
 START_TEST(fiber)
-- 

Best Regards, André Hentschel



More information about the wine-patches mailing list