Fix refcounting, use Interlocked functions.

This commit is contained in:
Mike McCormack 2005-01-20 20:34:29 +00:00 committed by Alexandre Julliard
parent 21842318e9
commit b3a7f37aaf
4 changed files with 12 additions and 7 deletions

View file

@ -157,7 +157,7 @@ void msiobj_addref( MSIOBJECTHDR *info )
return;
}
info->refcount++;
InterlockedIncrement(&info->refcount);
}
void msiobj_lock( MSIOBJECTHDR *info )
@ -185,12 +185,12 @@ int msiobj_release( MSIOBJECTHDR *info )
return -1;
}
ret = info->refcount--;
if (info->refcount == 0)
ret = InterlockedDecrement( &info->refcount );
if( ret==0 )
{
if( info->destructor )
if( info->destructor )
info->destructor( info );
HeapFree( GetProcessHeap(), 0, info );
HeapFree( GetProcessHeap(), 0, info );
TRACE("object %p destroyed\n", info);
}

View file

@ -228,9 +228,12 @@ BOOL encode_base85_guid( GUID *guid, LPWSTR str )
VOID MSI_CloseDatabase( MSIOBJECTHDR *arg )
{
MSIDATABASE *db = (MSIDATABASE *) arg;
DWORD r;
free_cached_tables( db );
IStorage_Release( db->storage );
r = IStorage_Release( db->storage );
if( r )
ERR("database reference count was not zero (%ld)\n", r);
}
UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)

View file

@ -53,7 +53,7 @@ struct tagMSIOBJECTHDR
{
UINT magic;
UINT type;
UINT refcount;
DWORD refcount;
msihandledestructor destructor;
struct tagMSIOBJECTHDR *next;
struct tagMSIOBJECTHDR *prev;

View file

@ -461,6 +461,8 @@ UINT WINAPI MsiDatabaseCommit( MSIHANDLE hdb )
/* FIXME: unlock the database */
msiobj_release( &db->hdr );
return r;
}