msi: Remove limit on number of handles.
This commit is contained in:
parent
98ec9399c4
commit
29f0803c02
|
@ -57,7 +57,8 @@ typedef struct msi_handle_info_t
|
||||||
DWORD dwThreadId;
|
DWORD dwThreadId;
|
||||||
} msi_handle_info;
|
} msi_handle_info;
|
||||||
|
|
||||||
static msi_handle_info msihandletable[MSIMAXHANDLES];
|
static msi_handle_info *msihandletable = NULL;
|
||||||
|
static int msihandletable_size = 0;
|
||||||
|
|
||||||
MSIHANDLE alloc_msihandle( MSIOBJECTHDR *obj )
|
MSIHANDLE alloc_msihandle( MSIOBJECTHDR *obj )
|
||||||
{
|
{
|
||||||
|
@ -67,11 +68,29 @@ MSIHANDLE alloc_msihandle( MSIOBJECTHDR *obj )
|
||||||
EnterCriticalSection( &MSI_handle_cs );
|
EnterCriticalSection( &MSI_handle_cs );
|
||||||
|
|
||||||
/* find a slot */
|
/* find a slot */
|
||||||
for(i=0; i<MSIMAXHANDLES; i++)
|
for(i=0; i<msihandletable_size; i++)
|
||||||
if( !msihandletable[i].obj )
|
if( !msihandletable[i].obj )
|
||||||
break;
|
break;
|
||||||
if( (i>=MSIMAXHANDLES) || msihandletable[i].obj )
|
if( i==msihandletable_size )
|
||||||
goto out;
|
{
|
||||||
|
msi_handle_info *p;
|
||||||
|
int newsize;
|
||||||
|
if (msihandletable_size == 0)
|
||||||
|
{
|
||||||
|
newsize = 256;
|
||||||
|
p = msi_alloc_zero(newsize*sizeof(msi_handle_info));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
newsize = msihandletable_size * 2;
|
||||||
|
p = msi_realloc_zero(msihandletable,
|
||||||
|
newsize*sizeof(msi_handle_info));
|
||||||
|
}
|
||||||
|
if (!p)
|
||||||
|
goto out;
|
||||||
|
msihandletable = p;
|
||||||
|
msihandletable_size = newsize;
|
||||||
|
}
|
||||||
|
|
||||||
msiobj_addref( obj );
|
msiobj_addref( obj );
|
||||||
msihandletable[i].obj = obj;
|
msihandletable[i].obj = obj;
|
||||||
|
@ -92,7 +111,7 @@ void *msihandle2msiinfo(MSIHANDLE handle, UINT type)
|
||||||
handle--;
|
handle--;
|
||||||
if( handle<0 )
|
if( handle<0 )
|
||||||
goto out;
|
goto out;
|
||||||
if( handle>=MSIMAXHANDLES )
|
if( handle>=msihandletable_size )
|
||||||
goto out;
|
goto out;
|
||||||
if( !msihandletable[handle].obj )
|
if( !msihandletable[handle].obj )
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -230,14 +249,18 @@ UINT WINAPI MsiCloseAllHandles(void)
|
||||||
|
|
||||||
TRACE("\n");
|
TRACE("\n");
|
||||||
|
|
||||||
for(i=0; i<MSIMAXHANDLES; i++)
|
EnterCriticalSection( &MSI_handle_cs );
|
||||||
|
for(i=0; i<msihandletable_size; i++)
|
||||||
{
|
{
|
||||||
if(msihandletable[i].dwThreadId == GetCurrentThreadId())
|
if(msihandletable[i].dwThreadId == GetCurrentThreadId())
|
||||||
{
|
{
|
||||||
|
LeaveCriticalSection( &MSI_handle_cs );
|
||||||
MsiCloseHandle( i+1 );
|
MsiCloseHandle( i+1 );
|
||||||
|
EnterCriticalSection( &MSI_handle_cs );
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
LeaveCriticalSection( &MSI_handle_cs );
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
|
@ -271,7 +271,6 @@ typedef struct tagMSISUMMARYINFO
|
||||||
#define GUID_SIZE 39
|
#define GUID_SIZE 39
|
||||||
|
|
||||||
#define MSIHANDLE_MAGIC 0x4d434923
|
#define MSIHANDLE_MAGIC 0x4d434923
|
||||||
#define MSIMAXHANDLES 0xf0
|
|
||||||
|
|
||||||
DEFINE_GUID(CLSID_IMsiServer, 0x000C101C,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
|
DEFINE_GUID(CLSID_IMsiServer, 0x000C101C,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
|
||||||
DEFINE_GUID(CLSID_IMsiServerX1, 0x000C103E,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
|
DEFINE_GUID(CLSID_IMsiServerX1, 0x000C103E,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
|
||||||
|
|
|
@ -1376,12 +1376,7 @@ static void test_handle_limit(void)
|
||||||
r = MsiDatabaseOpenView(hdb, szQueryBuf, &hviews[i]);
|
r = MsiDatabaseOpenView(hdb, szQueryBuf, &hviews[i]);
|
||||||
ok( r == ERROR_SUCCESS, "failed to open query %d\n", i);
|
ok( r == ERROR_SUCCESS, "failed to open query %d\n", i);
|
||||||
ok( hviews[i] != 0xdeadbeeb, "no handle set\n");
|
ok( hviews[i] != 0xdeadbeeb, "no handle set\n");
|
||||||
if (i < 0xef)
|
ok( hviews[i] != 0, "%d'th handle is NULL\n", i);
|
||||||
ok( hviews[i] != 0, "%d'th handle is NULL\n", i);
|
|
||||||
else
|
|
||||||
todo_wine {
|
|
||||||
ok( hviews[i] != 0, "%d'th handle is NULL\n", i);
|
|
||||||
}
|
|
||||||
if (!hviews[i])
|
if (!hviews[i])
|
||||||
break;
|
break;
|
||||||
ok( (i == 0 || (hviews[i] != hviews[i-1])),
|
ok( (i == 0 || (hviews[i] != hviews[i-1])),
|
||||||
|
|
Loading…
Reference in New Issue