Module: wine Branch: master Commit: e4c79c13b2313db95fc00f2350fd1da49cf5d8db URL: https://source.winehq.org/git/wine.git/?a=commit;h=e4c79c13b2313db95fc00f235...
Author: Owen Rudge orudge@codeweavers.com Date: Wed Jun 13 19:11:20 2018 +0100
wsdapi: Add critical section around notification sinks.
Signed-off-by: Owen Rudge orudge@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/wsdapi/discovery.c | 9 +++++++++ dlls/wsdapi/wsdapi_internal.h | 1 + 2 files changed, 10 insertions(+)
diff --git a/dlls/wsdapi/discovery.c b/dlls/wsdapi/discovery.c index 9971219..7456f90 100644 --- a/dlls/wsdapi/discovery.c +++ b/dlls/wsdapi/discovery.c @@ -97,6 +97,7 @@ static ULONG WINAPI IWSDiscoveryPublisherImpl_Release(IWSDiscoveryPublisher *ifa HeapFree(GetProcessHeap(), 0, sink); }
+ DeleteCriticalSection(&This->notification_sink_critical_section); HeapFree(GetProcessHeap(), 0, This); }
@@ -148,7 +149,9 @@ static HRESULT WINAPI IWSDiscoveryPublisherImpl_RegisterNotificationSink(IWSDisc sink->notificationSink = pSink; IWSDiscoveryPublisherNotify_AddRef(pSink);
+ EnterCriticalSection(&impl->notification_sink_critical_section); list_add_tail(&impl->notificationSinks, &sink->entry); + LeaveCriticalSection(&impl->notification_sink_critical_section);
if ((!impl->publisherStarted) && (!init_networking(impl))) return E_FAIL; @@ -168,6 +171,8 @@ static HRESULT WINAPI IWSDiscoveryPublisherImpl_UnRegisterNotificationSink(IWSDi return E_INVALIDARG; }
+ EnterCriticalSection(&impl->notification_sink_critical_section); + LIST_FOR_EACH_ENTRY(sink, &impl->notificationSinks, struct notificationSink, entry) { if (sink->notificationSink == pSink) @@ -176,10 +181,13 @@ static HRESULT WINAPI IWSDiscoveryPublisherImpl_UnRegisterNotificationSink(IWSDi list_remove(&sink->entry); HeapFree(GetProcessHeap(), 0, sink);
+ LeaveCriticalSection(&impl->notification_sink_critical_section); return S_OK; } }
+ LeaveCriticalSection(&impl->notification_sink_critical_section); + /* Notification sink is not registered */ return E_FAIL; } @@ -391,6 +399,7 @@ HRESULT WINAPI WSDCreateDiscoveryPublisher(IWSDXMLContext *pContext, IWSDiscover return ret; }
+ InitializeCriticalSection(&obj->notification_sink_critical_section); list_init(&obj->notificationSinks);
*ppPublisher = &obj->IWSDiscoveryPublisher_iface; diff --git a/dlls/wsdapi/wsdapi_internal.h b/dlls/wsdapi/wsdapi_internal.h index f88822d..3e5e163 100644 --- a/dlls/wsdapi/wsdapi_internal.h +++ b/dlls/wsdapi/wsdapi_internal.h @@ -48,6 +48,7 @@ typedef struct IWSDiscoveryPublisherImpl { IWSDXMLContext *xmlContext; DWORD addressFamily; struct list notificationSinks; + CRITICAL_SECTION notification_sink_critical_section; BOOL publisherStarted; HANDLE thread_handles[MAX_WSD_THREADS]; int num_thread_handles;