Owen Rudge : wsdapi: Add critical section around notification sinks.
Module: wine Branch: master Commit: e4c79c13b2313db95fc00f2350fd1da49cf5d8db URL: https://source.winehq.org/git/wine.git/?a=commit;h=e4c79c13b2313db95fc00f235... Author: Owen Rudge <orudge(a)codeweavers.com> Date: Wed Jun 13 19:11:20 2018 +0100 wsdapi: Add critical section around notification sinks. Signed-off-by: Owen Rudge <orudge(a)codeweavers.com> Signed-off-by: Huw Davies <huw(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)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;
participants (1)
-
Alexandre Julliard