Stefan Dösinger : ddraw: Hold the lock in creation functions.

Alexandre Julliard julliard at wine.codeweavers.com
Tue May 22 06:59:52 CDT 2007


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

Author: Stefan Dösinger <stefandoesinger at gmx.at>
Date:   Mon May 21 01:12:36 2007 +0200

ddraw: Hold the lock in creation functions.

---

 dlls/ddraw/ddraw.c         |    4 +++-
 dlls/ddraw/ddraw_private.h |    3 ---
 dlls/ddraw/main.c          |   42 +++++++++++++++++++++++++++---------------
 3 files changed, 30 insertions(+), 19 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 2d8dc8a..734ac99 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -268,7 +268,9 @@ IDirectDrawImpl_Destroy(IDirectDrawImpl *This)
     /* Unregister the window class */
     UnregisterClassA(This->classname, 0);
 
-    remove_ddraw_object(This);
+    EnterCriticalSection(&ddraw_cs);
+    list_remove(&This->ddraw_list_entry);
+    LeaveCriticalSection(&ddraw_cs);
 
     /* Release the attached WineD3D stuff */
     IWineD3DDevice_Release(This->wineD3DDevice);
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 5bd1164..ee194a1 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -203,9 +203,6 @@ IWineD3DVertexDeclaration *
 IDirectDrawImpl_FindDecl(IDirectDrawImpl *This,
                          DWORD fvf);
 
-void
-remove_ddraw_object(IDirectDrawImpl *ddraw);
-
 /* The default surface type */
 extern WINED3DSURFTYPE DefaultSurfaceType;
 
diff --git a/dlls/ddraw/main.c b/dlls/ddraw/main.c
index 963661b..2d28626 100644
--- a/dlls/ddraw/main.c
+++ b/dlls/ddraw/main.c
@@ -317,10 +317,7 @@ DDRAW_Create(const GUID *guid,
 #undef FX_CAPS
 
     list_init(&This->surface_list);
-
-    EnterCriticalSection(&ddraw_cs);
     list_add_head(&global_ddraw_list, &This->ddraw_list_entry);
-    LeaveCriticalSection(&ddraw_cs);
 
     This->decls = HeapAlloc(GetProcessHeap(), 0, 0);
     if(!This->decls)
@@ -358,9 +355,13 @@ DirectDrawCreate(GUID *GUID,
                  IDirectDraw **DD,
                  IUnknown *UnkOuter)
 {
+    HRESULT hr;
     TRACE("(%s,%p,%p)\n", debugstr_guid(GUID), DD, UnkOuter);
 
-    return DDRAW_Create(GUID, (void **) DD, UnkOuter, &IID_IDirectDraw);
+    EnterCriticalSection(&ddraw_cs);
+    hr = DDRAW_Create(GUID, (void **) DD, UnkOuter, &IID_IDirectDraw);
+    LeaveCriticalSection(&ddraw_cs);
+    return hr;
 }
 
 /***********************************************************************
@@ -378,12 +379,16 @@ DirectDrawCreateEx(GUID *GUID,
                    REFIID iid,
                    IUnknown *UnkOuter)
 {
+    HRESULT hr;
     TRACE("(%s,%p,%s,%p)\n", debugstr_guid(GUID), DD, debugstr_guid(iid), UnkOuter);
 
     if (!IsEqualGUID(iid, &IID_IDirectDraw7))
         return DDERR_INVALIDPARAMS;
 
-    return DDRAW_Create(GUID, DD, UnkOuter, iid);
+    EnterCriticalSection(&ddraw_cs);
+    hr = DDRAW_Create(GUID, DD, UnkOuter, iid);
+    LeaveCriticalSection(&ddraw_cs);
+    return hr;
 }
 
 /***********************************************************************
@@ -513,7 +518,9 @@ CF_CreateDirectDraw(IUnknown* UnkOuter, REFIID iid,
 
     TRACE("(%p,%s,%p)\n", UnkOuter, debugstr_guid(iid), obj);
 
+    EnterCriticalSection(&ddraw_cs);
     hr = DDRAW_Create(NULL, obj, UnkOuter, iid);
+    LeaveCriticalSection(&ddraw_cs);
     return hr;
 }
 
@@ -538,11 +545,18 @@ CF_CreateDirectDrawClipper(IUnknown* UnkOuter, REFIID riid,
     HRESULT hr;
     IDirectDrawClipper *Clip;
 
+    EnterCriticalSection(&ddraw_cs);
     hr = DirectDrawCreateClipper(0, &Clip, UnkOuter);
-    if (hr != DD_OK) return hr;
+    if (hr != DD_OK)
+    {
+        LeaveCriticalSection(&ddraw_cs);
+        return hr;
+    }
 
     hr = IDirectDrawClipper_QueryInterface(Clip, riid, obj);
     IDirectDrawClipper_Release(Clip);
+
+    LeaveCriticalSection(&ddraw_cs);
     return hr;
 }
 
@@ -751,8 +765,14 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
  */
 HRESULT WINAPI DllCanUnloadNow(void)
 {
+    HRESULT hr;
     FIXME("(void): stub\n");
-    return S_FALSE;
+
+    EnterCriticalSection(&ddraw_cs);
+    hr = S_FALSE;
+    LeaveCriticalSection(&ddraw_cs);
+
+    return hr;
 }
 
 /*******************************************************************************
@@ -943,11 +963,3 @@ DllMain(HINSTANCE hInstDLL,
 
     return TRUE;
 }
-
-void
-remove_ddraw_object(IDirectDrawImpl *ddraw)
-{
-    EnterCriticalSection(&ddraw_cs);
-    list_remove(&ddraw->ddraw_list_entry);
-    LeaveCriticalSection(&ddraw_cs);
-}




More information about the wine-cvs mailing list