Stefan Dösinger : ddraw: Hold the lock in IDirect3DTexture methods.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jun 5 05:48:30 CDT 2007


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

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Wed May 30 16:17:43 2007 +0200

ddraw: Hold the lock in IDirect3DTexture methods.

---

 dlls/ddraw/texture.c |   11 +++++++++++
 1 files changed, 11 insertions(+), 0 deletions(-)

diff --git a/dlls/ddraw/texture.c b/dlls/ddraw/texture.c
index e7e5f3f..0880154 100644
--- a/dlls/ddraw/texture.c
+++ b/dlls/ddraw/texture.c
@@ -217,6 +217,7 @@ IDirect3DTextureImpl_GetHandle(IDirect3DTexture2 *iface,
 
     TRACE("(%p)->(%p,%p)\n", This, d3d, lpHandle);
 
+    EnterCriticalSection(&ddraw_cs);
     if(!This->Handle)
     {
         This->Handle = IDirect3DDeviceImpl_CreateHandle(d3d);
@@ -230,6 +231,7 @@ IDirect3DTextureImpl_GetHandle(IDirect3DTexture2 *iface,
 
     TRACE(" returning handle %08x.\n", *lpHandle);
 
+    LeaveCriticalSection(&ddraw_cs);
     return D3D_OK;
 }
 
@@ -304,6 +306,7 @@ IDirect3DTextureImpl_Load(IDirect3DTexture2 *iface,
     HRESULT ret_value = D3D_OK;
 
     TRACE("(%p)->(%p)\n", This, src_ptr);
+    EnterCriticalSection(&ddraw_cs);
 
     if (((src_ptr->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP) != (This->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP)) ||
         (src_ptr->surface_desc.u2.dwMipMapCount != This->surface_desc.u2.dwMipMapCount))
@@ -331,6 +334,7 @@ IDirect3DTextureImpl_Load(IDirect3DTexture2 *iface,
         if( ret_value != D3D_OK)
         {
             ERR("IWineD3DSurface::GetPalette failed! This is unexpected\n");
+            LeaveCriticalSection(&ddraw_cs);
             return D3DERR_TEXTURE_LOAD_FAILED;
         }
         if(wine_pal)
@@ -339,6 +343,7 @@ IDirect3DTextureImpl_Load(IDirect3DTexture2 *iface,
             if(ret_value != D3D_OK)
             {
                 ERR("IWineD3DPalette::GetParent failed! This is unexpected\n");
+                LeaveCriticalSection(&ddraw_cs);
                 return D3DERR_TEXTURE_LOAD_FAILED;
             }
             pal_impl = ICOM_OBJECT(IDirectDrawPaletteImpl, IDirectDrawPalette, pal);
@@ -352,6 +357,7 @@ IDirect3DTextureImpl_Load(IDirect3DTexture2 *iface,
         if( ret_value != D3D_OK)
         {
             ERR("IWineD3DSurface::GetPalette failed! This is unexpected\n");
+            LeaveCriticalSection(&ddraw_cs);
             return D3DERR_TEXTURE_LOAD_FAILED;
         }
         if(wine_pal_src)
@@ -360,6 +366,7 @@ IDirect3DTextureImpl_Load(IDirect3DTexture2 *iface,
             if(ret_value != D3D_OK)
             {
                 ERR("IWineD3DPalette::GetParent failed! This is unexpected\n");
+                LeaveCriticalSection(&ddraw_cs);
                 return D3DERR_TEXTURE_LOAD_FAILED;
             }
             pal_impl_src = ICOM_OBJECT(IDirectDrawPaletteImpl, IDirectDrawPalette, pal_src);
@@ -395,6 +402,7 @@ IDirect3DTextureImpl_Load(IDirect3DTexture2 *iface,
         {
             /* Should also check for same pixel format, u1.lPitch, ... */
             ERR("Error in surface sizes\n");
+            LeaveCriticalSection(&ddraw_cs);
             return D3DERR_TEXTURE_LOAD_FAILED;
         }
         else
@@ -419,6 +427,7 @@ IDirect3DTextureImpl_Load(IDirect3DTexture2 *iface,
             if(ret_value != D3D_OK)
             {
                 ERR(" (%p) Locking the source surface failed\n", This);
+                LeaveCriticalSection(&ddraw_cs);
                 return D3DERR_TEXTURE_LOAD_FAILED;
             }
 
@@ -427,6 +436,7 @@ IDirect3DTextureImpl_Load(IDirect3DTexture2 *iface,
             {
                 ERR(" (%p) Locking the destination surface failed\n", This);
                 IWineD3DSurface_UnlockRect(src_ptr->WineD3DSurface);
+                LeaveCriticalSection(&ddraw_cs);
                 return D3DERR_TEXTURE_LOAD_FAILED;
             }
 
@@ -466,6 +476,7 @@ IDirect3DTextureImpl_Load(IDirect3DTexture2 *iface,
         }
     }
 
+    LeaveCriticalSection(&ddraw_cs);
     return ret_value;
 }
 




More information about the wine-cvs mailing list