On 8/19/20 10:48 AM, Jactry Zeng wrote:
+struct property_group +{
- ISharedPropertyGroup ISharedPropertyGroup_iface;
- struct group_manager *parent;
- LONG isolation, release;
- struct list entry;
- LONG refcount;
- BSTR name;
+};
I think common formatting pattern wine uses is placing refcount field after interfaces fields.
+static ULONG WINAPI property_group_Release(ISharedPropertyGroup *iface) +{
- struct property_group *group = impl_from_ISharedPropertyGroup(iface);
- ULONG refcount = InterlockedDecrement(&group->refcount);
- TRACE("%p decreasing refcount to %u.\n", iface, refcount);
- if (!refcount)
- {
struct group_manager *manager = group->parent;SysFreeString(group->name);EnterCriticalSection(&manager->cs);list_remove(&group->entry);LeaveCriticalSection(&manager->cs);ISharedPropertyGroupManager_Release(&manager->ISharedPropertyGroupManager_iface);- }
- return refcount;
+}
This probably need to free group itself too.
@@ -74,10 +248,21 @@ static ULONG WINAPI group_manager_Release(ISharedPropertyGroupManager *iface)
if (!refcount) {
if (!list_empty(&manager->property_groups)){struct property_group *group, *group2;LIST_FOR_EACH_ENTRY_SAFE(group, group2, &manager->property_groups, struct property_group, entry){list_remove(&group->entry);SysFreeString(group->name);heap_free(group);}}
There is no need for list_empty() test. Loop body would mostly duplicate group's own Release() I imagine.
+static struct property_group *find_propery_group(struct group_manager *manager, BSTR name) +{
- struct property_group *group, *group2;
- LIST_FOR_EACH_ENTRY_SAFE(group, group2, &group_manager->property_groups, struct property_group, entry)
- {
if (!lstrcmpW(group->name, name))return group;- }
- return NULL;
+}
You don't need _SAFE() here.
- {
*exists = TRUE;*isolation = property_group->isolation;*release = property_group->release;hr = ISharedPropertyGroup_QueryInterface(&property_group->ISharedPropertyGroup_iface,&IID_ISharedPropertyGroup, (void **)group);- }
I think it's more straightforward to have assignment + addref instead, as above. This will get rid of 'hr' too.