[PATCH v2 3/5] msi: Don't refcount the msi_custom_action_info struct.
Zebediah Figura
z.figura12 at gmail.com
Thu Aug 16 10:34:39 CDT 2018
This is unnecessary, and may have always been so. The struct will either be
freed after it completes synchronously, or after it has completed
asynchronously in ACTION_FinishCustomActions().
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/msi/custom.c | 46 ++++++++++++++--------------------------------
1 file changed, 14 insertions(+), 32 deletions(-)
diff --git a/dlls/msi/custom.c b/dlls/msi/custom.c
index 9418b42..950681e 100644
--- a/dlls/msi/custom.c
+++ b/dlls/msi/custom.c
@@ -380,7 +380,6 @@ static UINT wait_process_handle(MSIPACKAGE* package, UINT type,
typedef struct _msi_custom_action_info {
struct list entry;
- LONG refs;
MSIPACKAGE *package;
LPWSTR source;
LPWSTR target;
@@ -391,31 +390,22 @@ typedef struct _msi_custom_action_info {
DWORD arch;
} msi_custom_action_info;
-static void release_custom_action_data( msi_custom_action_info *info )
+static void free_custom_action_data( msi_custom_action_info *info )
{
EnterCriticalSection( &msi_custom_action_cs );
- if (!--info->refs)
- {
- list_remove( &info->entry );
- if (info->handle)
- CloseHandle( info->handle );
- msi_free( info->action );
- msi_free( info->source );
- msi_free( info->target );
- msiobj_release( &info->package->hdr );
- msi_free( info );
- }
+ list_remove( &info->entry );
+ if (info->handle)
+ CloseHandle( info->handle );
+ msi_free( info->action );
+ msi_free( info->source );
+ msi_free( info->target );
+ msiobj_release( &info->package->hdr );
+ msi_free( info );
LeaveCriticalSection( &msi_custom_action_cs );
}
-/* must be called inside msi_custom_action_cs if info is in the pending custom actions list */
-static void addref_custom_action_data( msi_custom_action_info *info )
-{
- info->refs++;
- }
-
static UINT wait_thread_handle( msi_custom_action_info *info )
{
UINT rc = ERROR_SUCCESS;
@@ -429,7 +419,7 @@ static UINT wait_thread_handle( msi_custom_action_info *info )
if (!(info->type & msidbCustomActionTypeContinue))
rc = custom_get_thread_return( info->package, info->handle );
- release_custom_action_data( info );
+ free_custom_action_data( info );
}
else
{
@@ -450,7 +440,6 @@ static msi_custom_action_info *find_action_by_guid( const GUID *guid )
{
if (IsEqualGUID( &info->guid, guid ))
{
- addref_custom_action_data( info );
found = TRUE;
break;
}
@@ -725,7 +714,6 @@ static msi_custom_action_info *do_msidbCustomActionTypeDll(
return NULL;
msiobj_addref( &package->hdr );
- info->refs = 2; /* 1 for our caller and 1 for thread we created */
info->package = package;
info->type = type;
info->target = strdupW( target );
@@ -767,9 +755,7 @@ static msi_custom_action_info *do_msidbCustomActionTypeDll(
info->handle = CreateThread(NULL, 0, custom_client_thread, info, 0, NULL);
if (!info->handle)
{
- /* release both references */
- release_custom_action_data( info );
- release_custom_action_data( info );
+ free_custom_action_data( info );
return NULL;
}
@@ -1056,7 +1042,6 @@ static DWORD ACTION_CallScript( const GUID *guid )
else
ERR("failed to create handle for %p\n", info->package );
- release_custom_action_data( info );
return r;
}
@@ -1085,7 +1070,6 @@ static msi_custom_action_info *do_msidbCustomActionTypeScript(
return NULL;
msiobj_addref( &package->hdr );
- info->refs = 2; /* 1 for our caller and 1 for thread we created */
info->package = package;
info->type = type;
info->target = strdupW( function );
@@ -1100,9 +1084,7 @@ static msi_custom_action_info *do_msidbCustomActionTypeScript(
info->handle = CreateThread( NULL, 0, ScriptThread, &info->guid, 0, NULL );
if (!info->handle)
{
- /* release both references */
- release_custom_action_data( info );
- release_custom_action_data( info );
+ free_custom_action_data( info );
return NULL;
}
@@ -1496,7 +1478,8 @@ void ACTION_FinishCustomActions(const MSIPACKAGE* package)
EnterCriticalSection( &msi_custom_action_cs );
LIST_FOR_EACH_ENTRY_SAFE( info, cursor, &msi_pending_custom_actions, msi_custom_action_info, entry )
{
- if (info->package == package) release_custom_action_data( info );
+ if (info->package == package)
+ free_custom_action_data( info );
}
LeaveCriticalSection( &msi_custom_action_cs );
}
@@ -1514,6 +1497,5 @@ UINT __cdecl s_remote_GetActionInfo(const GUID *guid, int *type, LPWSTR *dll, LP
*dll = strdupW(info->source);
*func = strdupWtoA(info->target);
- release_custom_action_data(info);
return ERROR_SUCCESS;
}
--
2.7.4
More information about the wine-devel
mailing list