user: Use DDE critical section exclusively for instance list protection.
diff --git a/dlls/user/dde_server.c b/dlls/user/dde_server.c
index 5f0f5ee..545b80e 100644
--- a/dlls/user/dde_server.c
+++ b/dlls/user/dde_server.c
@@ -69,17 +69,13 @@
TRACE("(%d,%p,%p)\n", idInst, hszTopic, hszItem);
- EnterCriticalSection(&WDML_CritSect);
-
pInstance = WDML_GetInstance(idInst);
if (pInstance == NULL || pInstance->links == NULL)
- {
- goto theError;
- }
+ return FALSE;
atom = WDML_MakeAtomFromHsz(hszItem);
- if (!atom) goto theError;
+ if (!atom) return FALSE;
/* first compute the number of links which will trigger a message */
count = 0;
@@ -145,10 +141,9 @@
}
}
}
- LeaveCriticalSection(&WDML_CritSect);
return TRUE;
+
theError:
- LeaveCriticalSection(&WDML_CritSect);
if (atom) GlobalDeleteAtom(atom);
return FALSE;
}
@@ -179,8 +174,6 @@
TRACE("(%d,%p,%p,%x)\n", idInst, hsz1, hsz2, afCmd);
- EnterCriticalSection(&WDML_CritSect);
-
/* First check instance
*/
pInstance = WDML_GetInstance(idInst);
@@ -188,7 +181,7 @@
{
TRACE("Instance not found as initialised\n");
/* Nothing has been initialised - exit now ! can return TRUE since effect is the same */
- goto theError;
+ return NULL;
}
if (hsz2 != 0L)
@@ -197,7 +190,7 @@
*/
pInstance->lastError = DMLERR_INVALIDPARAMETER;
WARN("Reserved parameter no-zero !!\n");
- goto theError;
+ return NULL;
}
if (hsz1 == 0 && !(afCmd & DNS_UNREGISTER))
{
@@ -206,7 +199,7 @@
*/
TRACE("General unregister unexpected flags\n");
pInstance->lastError = DMLERR_INVALIDPARAMETER;
- goto theError;
+ return NULL;
}
switch (afCmd & (DNS_REGISTER | DNS_UNREGISTER))
@@ -217,7 +210,7 @@
{
ERR("Trying to register already registered service!\n");
pInstance->lastError = DMLERR_DLL_USAGE;
- goto theError;
+ return NULL;
}
TRACE("Adding service name\n");
@@ -244,11 +237,9 @@
RegisterClassExW(&wndclass);
- LeaveCriticalSection(&WDML_CritSect);
hwndServer = CreateWindowW(szServerNameClass, NULL,
WS_POPUP, 0, 0, 0, 0,
0, 0, 0, 0);
- EnterCriticalSection(&WDML_CritSect);
SetWindowLongPtrW(hwndServer, GWL_WDML_INSTANCE, (ULONG_PTR)pInstance);
SetWindowLongPtrW(hwndServer, GWL_WDML_SERVER, (ULONG_PTR)pServer);
@@ -285,19 +276,14 @@
/* trying to filter where no service names !!
*/
pInstance->lastError = DMLERR_DLL_USAGE;
- goto theError;
+ return NULL;
}
else
{
pServer->filterOn = (afCmd & DNS_FILTERON) != 0;
}
}
- LeaveCriticalSection(&WDML_CritSect);
return (HDDEDATA)TRUE;
-
- theError:
- LeaveCriticalSection(&WDML_CritSect);
- return FALSE;
}
/******************************************************************
@@ -998,13 +984,11 @@
if (iMsg == WM_DESTROY)
{
- EnterCriticalSection(&WDML_CritSect);
pConv = WDML_GetConvFromWnd(hwndServer);
if (pConv && !(pConv->wStatus & ST_TERMINATED))
{
WDML_ServerHandleTerminate(pConv, NULL);
}
- LeaveCriticalSection(&WDML_CritSect);
}
if (iMsg < WM_DDE_FIRST || iMsg > WM_DDE_LAST)
{
@@ -1012,25 +996,23 @@
DefWindowProcA(hwndServer, iMsg, wParam, lParam);
}
- EnterCriticalSection(&WDML_CritSect);
-
pInstance = WDML_GetInstanceFromWnd(hwndServer);
pConv = WDML_GetConvFromWnd(hwndServer);
if (!pConv)
{
ERR("Got a message (%x) on a not known conversation, dropping request\n", iMsg);
- goto theError;
+ return 0;
}
if (pConv->hwndClient != WIN_GetFullHandle( (HWND)wParam ) || pConv->hwndServer != hwndServer)
{
ERR("mismatch between C/S windows and converstation\n");
- goto theError;
+ return 0;
}
if (pConv->instance != pInstance || pConv->instance == NULL)
{
ERR("mismatch in instances\n");
- goto theError;
+ return 0;
}
switch (iMsg)
@@ -1083,7 +1065,6 @@
WDML_FreeTransaction(pInstance, pXAct, TRUE);
}
}
- theError:
- LeaveCriticalSection(&WDML_CritSect);
+
return 0;
}