[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