[PATCH v5 5/8] msvcr120: Add tests for _StructuredTaskCollection.

Piotr Caban piotr.caban at gmail.com
Thu Apr 21 07:04:31 CDT 2022


Hi Torge,

Please try to expand the tests.

On 4/20/22 16:33, Torge Matthies wrote:
> +typedef struct UnrealizedChore
> +{
> +    void *unk1;
> +    void (__cdecl *callback)(struct UnrealizedChore *_this, void *unk);
> +    void *unk2;
> +    void *unk3;
> +    void *unk4;
> +    void *unk5;
> +    void *unk6;
> +    void *unk7;
> +    void *unk8;
> +    void *unk9;
> +} UnrealizedChore;
It should look as follows:
const void *vtable;
void (__cdecl *chore_proc)(_UnrealizedChore*);
_StructuredTaskCollection *task_collection;
void (__cdecl *chore_wrapper)(_UnrealizedChore*);
void unk[6];

where vtable contains only destructor, task_collection is set in 
_Schedule call, unk[6] is to preserve the size you have found.

The chore_wrapper is interesting. It deserves some tests. It's set when 
_Schedule is called. When called it invokes chore_proc. I guess it 
guards against exceptions. It works only if task_collection is non null.

> +static StructuredTaskCollection* (__stdcall *p__StructuredTaskCollection_ctor)(StructuredTaskCollection*, void*);
This is a thiscall function.

> +static void (__thiscall *p__StructuredTaskCollection_dtor)(StructuredTaskCollection*);
> +static void (__thiscall *p__StructuredTaskCollection__Schedule)(StructuredTaskCollection*, UnrealizedChore*);
> +static int (__thiscall *p__StructuredTaskCollection__RunAndWait)(StructuredTaskCollection*, UnrealizedChore*);
This is a stdcall function.

> +static void setup_chore(UnrealizedChore *chore, void (__cdecl *callback)(struct UnrealizedChore *_this, void *unk))
Please rename the function to _UnrealizedChore_ctor. As far as I can see 
callback takes only 1 argument (_UnrealizedChore*).

> +static void test_StructuredTaskCollection(void)
> +{
> +    StructuredTaskCollection task_coll;
> +    UnrealizedChore chore1, chore2;
> +    int status;
> +
> +    chore_evt1 = CreateEventW(NULL, FALSE, FALSE, NULL);
> +    ok(chore_evt1 != NULL, "CreateEvent failed\n");
> +    chore_evt2 = CreateEventW(NULL, FALSE, FALSE, NULL);
> +    ok(chore_evt2 != NULL, "CreateEvent failed\n");
> +
> +    call_func2(p__StructuredTaskCollection_ctor, &task_coll, NULL);
> +
> +    /* test that all chores are run in parallel */
> +    setup_chore(&chore1, chore1_cb);
> +    setup_chore(&chore2, chore2_cb);
> +    call_func2(p__StructuredTaskCollection__Schedule, &task_coll, &chore1);
Please test chore structure fields after the call. The tests also missed 
that the chore is already executed when _Schedule is called.

> +    call_func2(p__StructuredTaskCollection__Schedule, &task_coll, &chore2);
> +    status = call_func2(p__StructuredTaskCollection__RunAndWait, &task_coll, NULL);status = p__StructuredTaskCollection__RunAndWait(&task_coll, NULL);

Thanks,
Piotr



More information about the wine-devel mailing list