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