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

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jun 4 08:14:28 CDT 2007


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

Author: Stefan Dösinger <stefandoesinger at gmx.at>
Date:   Sun May 20 23:51:26 2007 +0200

ddraw: Hold the lock in IDirectDrawClipper methods.

---

 dlls/ddraw/clipper.c |   42 ++++++++++++++++++++++++++++++++----------
 1 files changed, 32 insertions(+), 10 deletions(-)

diff --git a/dlls/ddraw/clipper.c b/dlls/ddraw/clipper.c
index eb8a8db..517bc7c 100644
--- a/dlls/ddraw/clipper.c
+++ b/dlls/ddraw/clipper.c
@@ -106,8 +106,10 @@ static ULONG WINAPI IDirectDrawClipperImpl_Release(IDirectDrawClipper *iface) {
 
     if (ref == 0)
     {
+        EnterCriticalSection(&ddraw_cs);
         IWineD3DClipper_Release(This->wineD3DClipper);
         HeapFree(GetProcessHeap(), 0, This);
+        LeaveCriticalSection(&ddraw_cs);
         return 0;
     }
     else return ref;
@@ -135,9 +137,11 @@ static HRESULT WINAPI IDirectDrawClipperImpl_SetHwnd(
     HRESULT hr;
     TRACE("(%p)->(%08x,%p)\n", This, dwFlags, hWnd);
 
+    EnterCriticalSection(&ddraw_cs);
     hr = IWineD3DClipper_SetHWnd(This->wineD3DClipper,
                                  dwFlags,
                                  hWnd);
+    LeaveCriticalSection(&ddraw_cs);
     switch(hr)
     {
         case WINED3DERR_INVALIDCALL:        return DDERR_INVALIDPARAMS;
@@ -168,12 +172,16 @@ static HRESULT WINAPI IDirectDrawClipperImpl_GetClipList(
     LPDWORD lpdwSize)
 {
     IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
+    HRESULT hr;
     TRACE("(%p,%p,%p,%p)\n", This, lpRect, lpClipList, lpdwSize);
 
-    return IWineD3DClipper_GetClipList(This->wineD3DClipper,
-                                       lpRect,
-                                       lpClipList,
-                                       lpdwSize);
+    EnterCriticalSection(&ddraw_cs);
+    hr = IWineD3DClipper_GetClipList(This->wineD3DClipper,
+                                     lpRect,
+                                     lpClipList,
+                                     lpdwSize);
+    LeaveCriticalSection(&ddraw_cs);
+    return hr;
 }
 
 /*****************************************************************************
@@ -194,10 +202,14 @@ static HRESULT WINAPI IDirectDrawClipperImpl_SetClipList(
     LPDIRECTDRAWCLIPPER iface,LPRGNDATA lprgn,DWORD dwFlag
 ) {
     IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
+    HRESULT hr;
 
-    return IWineD3DClipper_SetClipList(This->wineD3DClipper,
-                                       lprgn,
-                                       dwFlag);
+    EnterCriticalSection(&ddraw_cs);
+    hr = IWineD3DClipper_SetClipList(This->wineD3DClipper,
+                                     lprgn,
+                                     dwFlag);
+    LeaveCriticalSection(&ddraw_cs);
+    return hr;
 }
 
 /*****************************************************************************
@@ -215,10 +227,14 @@ static HRESULT WINAPI IDirectDrawClipperImpl_GetHWnd(
     LPDIRECTDRAWCLIPPER iface, HWND* hWndPtr
 ) {
     IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
+    HRESULT hr;
     TRACE("(%p)->(%p)\n", This, hWndPtr);
 
-    return IWineD3DClipper_GetHWnd(This->wineD3DClipper,
-                                   hWndPtr);
+    EnterCriticalSection(&ddraw_cs);
+    hr =  IWineD3DClipper_GetHWnd(This->wineD3DClipper,
+                                  hWndPtr);
+    LeaveCriticalSection(&ddraw_cs);
+    return hr;
 }
 
 /*****************************************************************************
@@ -242,11 +258,17 @@ static HRESULT WINAPI IDirectDrawClipperImpl_Initialize(
     IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
     TRACE("(%p)->(%p,0x%08x)\n", This, lpDD, dwFlags);
 
-    if (This->ddraw_owner != NULL) return DDERR_ALREADYINITIALIZED;
+    EnterCriticalSection(&ddraw_cs);
+    if (This->ddraw_owner != NULL)
+    {
+        LeaveCriticalSection(&ddraw_cs);
+        return DDERR_ALREADYINITIALIZED;
+    }
 
     pOwner = ICOM_OBJECT(IDirectDrawImpl, IDirectDraw, lpDD);
     This->ddraw_owner = pOwner;
 
+    LeaveCriticalSection(&ddraw_cs);
     return DD_OK;
 }
 




More information about the wine-cvs mailing list