[PATCH 3/5] comsvcs: Implement ISharedPropertyGroupManager_CreatePropertyGroup().
Nikolay Sivov
nsivov at codeweavers.com
Mon Aug 17 08:38:52 CDT 2020
On 8/17/20 3:54 PM, Jactry Zeng wrote:
> + if (!refcount)
> + {
> + struct group_manager *manager = impl_from_ISharedPropertyGroupManager(group->parent);
> + size_t count, index;
> +
> + SysFreeString(group->name);
> +
> + index = group - manager->property_groups;
> + manager->count--;
> + count = manager->count - index;
> + if (count)
> + memmove(&manager->property_groups[index], &manager->property_groups[index + 1], count * sizeof(*manager->property_groups));
> +
> + ISharedPropertyGroupManager_Release(group->parent);
> + }
That's not ideal to have back link to manager like that, but I see tests
show that it might be happening. It's probably easier to keep a list
instead, you can then unlink and release parent, potentially with some
locking later. You can also store 'struct group_manager*' directly
there, so you don't have to do an impl_from_*().
> + name = SysAllocString(L"testgroupname2");
> + isolation = 0;
> + release = 1;
> + exists = TRUE;
> + expected_refcount = get_refcount(manager) + 1;
> + hr = ISharedPropertyGroupManager_CreatePropertyGroup(manager, name, &isolation, &release, &exists, &group1);
> + ok(hr == S_OK, "Got hr %#x.\n", hr);
> + ok(!exists, "Got unexpected value %d.\n", exists);
> + refcount = get_refcount(group1);
> + todo_wine ok(refcount == 2, "Got unexpected refcount: %d.\n", refcount);
> + refcount = get_refcount(manager);
> + ok(refcount == expected_refcount, "Got refcount: %d, expected %d.\n", refcount, expected_refcount);
> + SysFreeString(name);
That's a weird bit. It might be important to try different release modes
to see what's going on.
More information about the wine-devel
mailing list