Module: wine Branch: master Commit: bfe631dfb91334891d9ca6da43d162ff29200455 URL: http://source.winehq.org/git/wine.git/?a=commit;h=bfe631dfb91334891d9ca6da43...
Author: Stefan Dösinger stefandoesinger@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); -}