Henri Verbeet : wined3d: Handle error conditions better in RemoveContextFromArray().
Alexandre Julliard
julliard at winehq.org
Mon Mar 9 09:40:43 CDT 2009
Module: wine
Branch: master
Commit: 4e2c87dd22cae51c6f27521fc3061150f06f2595
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4e2c87dd22cae51c6f27521fc3061150f06f2595
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Mon Mar 9 14:31:28 2009 +0100
wined3d: Handle error conditions better in RemoveContextFromArray().
---
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;
}
/*****************************************************************************
More information about the wine-cvs
mailing list