wined3d: Handle error conditions better in RemoveContextFromArray().
Henri Verbeet
hverbeet at codeweavers.com
Mon Mar 9 08:31:28 CDT 2009
---
dlls/wined3d/context.c | 55 ++++++++++++++++++++++++++++++++---------------
1 files changed, 37 insertions(+), 18 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 3258909..6353aa7 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -919,31 +919,50 @@ out:
*
*****************************************************************************/
static void RemoveContextFromArray(IWineD3DDeviceImpl *This, WineD3DContext *context) {
- UINT t, s;
- WineD3DContext **oldArray = This->contexts;
+ WineD3DContext **new_array;
+ BOOL found = FALSE;
+ UINT i;
TRACE("Removing ctx %p\n", context);
- This->numContexts--;
-
- if(This->numContexts) {
- This->contexts = HeapAlloc(GetProcessHeap(), 0, sizeof(*This->contexts) * This->numContexts);
- if(!This->contexts) {
- ERR("Cannot allocate a new context array, PANIC!!!\n");
- }
- 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++;
+ for (i = 0; i < This->numContexts; ++i)
+ {
+ if (This->contexts[i] == context)
+ {
+ HeapFree(GetProcessHeap(), 0, context);
+ found = TRUE;
+ break;
}
- } else {
+ }
+
+ if (!found)
+ {
+ 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;
}
- HeapFree(GetProcessHeap(), 0, context);
- HeapFree(GetProcessHeap(), 0, oldArray);
+ 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;
}
/*****************************************************************************
--
1.6.0.6
--------------020303020304050800070801--
More information about the wine-patches
mailing list