wined3d: Handle error conditions better in RemoveContextFromArray().

This commit is contained in:
Henri Verbeet 2009-03-09 14:31:28 +01:00 committed by Alexandre Julliard
parent 695c69f6a0
commit 4e2c87dd22
1 changed files with 38 additions and 19 deletions

View File

@ -919,31 +919,50 @@ out:
* *
*****************************************************************************/ *****************************************************************************/
static void RemoveContextFromArray(IWineD3DDeviceImpl *This, WineD3DContext *context) { static void RemoveContextFromArray(IWineD3DDeviceImpl *This, WineD3DContext *context) {
UINT t, s; WineD3DContext **new_array;
WineD3DContext **oldArray = This->contexts; BOOL found = FALSE;
UINT i;
TRACE("Removing ctx %p\n", context); TRACE("Removing ctx %p\n", context);
This->numContexts--; for (i = 0; i < This->numContexts; ++i)
{
if(This->numContexts) { if (This->contexts[i] == context)
This->contexts = HeapAlloc(GetProcessHeap(), 0, sizeof(*This->contexts) * This->numContexts); {
if(!This->contexts) { HeapFree(GetProcessHeap(), 0, context);
ERR("Cannot allocate a new context array, PANIC!!!\n"); found = TRUE;
break;
} }
t = 0;
/* Note that we decreased numContexts a few lines up, so use '<=' instead of '<' */
for(s = 0; s <= This->numContexts; s++) {
if(oldArray[s] == context) continue;
This->contexts[t] = oldArray[s];
t++;
}
} else {
This->contexts = NULL;
} }
HeapFree(GetProcessHeap(), 0, context); if (!found)
HeapFree(GetProcessHeap(), 0, oldArray); {
ERR("Context %p doesn't exist in context array\n", context);
return;
}
while (i < This->numContexts - 1)
{
This->contexts[i] = This->contexts[i + 1];
++i;
}
--This->numContexts;
if (!This->numContexts)
{
HeapFree(GetProcessHeap(), 0, This->contexts);
This->contexts = NULL;
return;
}
new_array = HeapReAlloc(GetProcessHeap(), 0, This->contexts, This->numContexts * sizeof(*This->contexts));
if (!new_array)
{
ERR("Failed to shrink context array. Oh well.\n");
return;
}
This->contexts = new_array;
} }
/***************************************************************************** /*****************************************************************************