Henri Verbeet : d3d8: Don't call Release() in a while loop.

Alexandre Julliard julliard at winehq.org
Tue Mar 10 10:53:26 CDT 2009


Module: wine
Branch: master
Commit: 954c3e22e1346c84fdac86cac60cc67e4ebd76f2
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=954c3e22e1346c84fdac86cac60cc67e4ebd76f2

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue Mar 10 09:19:05 2009 +0100

d3d8: Don't call Release() in a while loop.

There should only ever be a single reference to these objects, since only
their handle is exposed outside d3d8. Should there be more references than
that, calling Release() in a while loop probably isn't the right approach.

---

 dlls/d3d8/device.c |   19 ++++++++++++++++---
 1 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index 33edbe8..7c2d13b 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -1302,7 +1302,12 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DeleteStateBlock(LPDIRECT3DDEVICE8 if
     TRACE("(%p) Relay\n", This);
 
     EnterCriticalSection(&d3d8_cs);
-    while(IUnknown_Release((IUnknown *)pSB));
+
+    if (IUnknown_Release((IUnknown *)pSB))
+    {
+        ERR("Stateblock %p has references left, this shouldn't happen.\n", pSB);
+    }
+
     LeaveCriticalSection(&d3d8_cs);
 
     return D3D_OK;
@@ -1910,7 +1915,11 @@ static HRESULT  WINAPI  IDirect3DDevice8Impl_DeleteVertexShader(LPDIRECT3DDEVICE
             IWineD3DVertexShader_Release(cur);
         }
 
-        while(IUnknown_Release((IUnknown *)shader));
+        if (IUnknown_Release((IUnknown *)shader))
+        {
+            ERR("Shader %p has references left, this shouldn't happen.\n", shader);
+        }
+
         free_shader_handle(This, handle);
     }
     LeaveCriticalSection(&d3d8_cs);
@@ -2164,7 +2173,11 @@ static HRESULT WINAPI IDirect3DDevice8Impl_DeletePixelShader(LPDIRECT3DDEVICE8 i
             IWineD3DPixelShader_Release(cur);
         }
 
-        while(IUnknown_Release((IUnknown *)shader));
+        if (IUnknown_Release((IUnknown *)shader))
+        {
+            ERR("Shader %p has references left, this shouldn't happen.\n", shader);
+        }
+
         free_shader_handle(This, handle);
     }
     LeaveCriticalSection(&d3d8_cs);




More information about the wine-cvs mailing list