[PATCH 1/3] kernel32/tests/fiber: Add tests for fiber-local storage.

André Hentschel nerv at dawncrow.de
Sat Jul 2 09:55:53 CDT 2016


Am 02.07.2016 um 04:41 schrieb John Sheu:
> Signed-off-by: John Sheu <sheu at google.com>

Hi and welcome to Wine development!
May I ask if you could name an application which will benefit from your fixes?
Your tests currently fail on our testbot as you can see here: https://source.winehq.org/patches/
Some inline comments:

>  static VOID WINAPI FiberMainProc(LPVOID lpFiberParameter)
>  {
>      BYTE *tparam = (BYTE *)lpFiberParameter;
> -    cbCount++;
> +    fiberCount++;
>      ok(*tparam == 185, "Parameterdata expected not to be changed\n");
> +    if (fls_index_to_set != FLS_OUT_OF_INDEXES)
> +    {
> +        if (!pFlsSetValue || !pFlsGetValue)
> +        {
> +            win_skip( "Fiber Local Storage not supported\n" );
> +        }
> +        else
> +        {
> +            PVOID pret;
> +            BOOL bret;
> +
> +            pret = FlsGetValue(fls_index_to_set);
> +            ok(pret == NULL, "FlsGetValue returned %p, expected NULL\n", pret);
> +
> +            /* Set the FLS value */
> +            SetLastError( 0xdeadbeef );
> +            bret = pFlsSetValue(fls_index_to_set, fls_value_to_set);
> +            ok(bret, "FlsSetValue failed with error %u\n", GetLastError());
> +
> +            /* Verify that FlsGetValue retrieves the value set by FlsSetValue */
> +            SetLastError( 0xdeadbeef );
> +            pret = FlsGetValue(fls_index_to_set);
> +            ok(pret == fls_value_to_set,
> +               "FlsGetValue returned %p, expected %p\n", pret, fls_value_to_set);
> +            ok(GetLastError() == ERROR_SUCCESS,
> +	       "FlsGetValue error %u\n", GetLastError());
> +        }
> +    }
>      pSwitchToFiber(fibers[0]);
>  }

You are mixing tabs and spaces in FiberMainProc, spaces are preferred. Further you can avoid some line brakes in ok() calls, only wrap at around 100 

> +static void test_FiberLocalStorageWithFibers(PFLS_CALLBACK_FUNCTION cbfunc) {
> +    PVOID val1 = (PVOID) 0x314;
> +    PVOID val2 = (PVOID) 0x152;
> +    BOOL ret;
> +
> +    if (!pConvertThreadToFiber || !pSwitchToFiber || !pDeleteFiber)
> +    {
> +        win_skip( "Fibers not supported\n" );
> +        return;
> +    }
> +    if (!pFlsAlloc || !pFlsFree || !pFlsSetValue || !pFlsGetValue)
> +    {
> +        win_skip( "Fiber Local Storage not supported\n" );
> +        return;
> +    }
> +
> +
> +    fls_index_to_set = pFlsAlloc(cbfunc);
> +    ok(fls_index_to_set != FLS_OUT_OF_INDEXES, "FlsAlloc failed with error %d\n", GetLastError());
> +
> +    fiberCount = 0;
> +    cbCount = 0;
> +    fibers[0] = pConvertThreadToFiber(&testparam);

Why do you convert the current thread into a fiber? It seems to me that is causing the crash on w2k3.
You could try to run that test in a seperate thread

> +    fibers[1] = pCreateFiber(0,FiberMainProc,&testparam);
> +    fibers[2] = pCreateFiber(0,FiberMainProc,&testparam);
> +    ok(fibers[1] != 0, "CreateFiber failed with error %d\n", GetLastError());
> +    ok(fibers[2] != 0, "CreateFiber failed with error %d\n", GetLastError());
> +    ok(fiberCount == 0, "Wrong fiber count: %d\n", fiberCount);
> +    ok(cbCount == 0, "Wrong callback count: %d\n", cbCount);
> +
> +    fiberCount = 0;
> +    cbCount = 0;
> +    fls_value_to_set = val1;
> +    pSwitchToFiber(fibers[1]);
> +    ok(fiberCount == 1, "Wrong fiber count: %d\n", fiberCount);
> +    ok(cbCount == 0, "Wrong callback count: %d\n", cbCount);
> +
> +    fiberCount = 0;
> +    cbCount = 0;
> +    fls_value_to_set = val2;
> +    pSwitchToFiber(fibers[2]);
> +    ok(fiberCount == 1, "Wrong fiber count: %d\n", fiberCount);
> +    ok(cbCount == 0, "Wrong callback count: %d\n", cbCount);
> +
> +    fls_value_to_set = val2;
> +    ret = pFlsSetValue(fls_index_to_set, fls_value_to_set);
> +    ok(ret, "FlsSetValue failed\n");
> +    ok(val2 == pFlsGetValue(fls_index_to_set), "FlsGetValue failed\n");
> +
> +    fiberCount = 0;
> +    cbCount = 0;
> +    fls_value_to_set = val1;
> +    pDeleteFiber(fibers[1]);
> +    ok(fiberCount == 0, "Wrong fiber count: %d\n", fiberCount);
> +    todo_wine
> +    {
> +        ok(cbCount == 1, "Wrong callback count: %d\n", cbCount);
> +    }

You can make that a one liner:
todo_wine ok();




Hope that helps
Have fun!



More information about the wine-devel mailing list