Jacek Caban : rpcrt4: Wait for server threads to finish in RpcMgmtWaitServerListen.
Alexandre Julliard
julliard at winehq.org
Wed May 31 16:20:18 CDT 2017
Module: wine
Branch: master
Commit: 09e98be24350a7a8306cc6cd7302f94eae770afc
URL: http://source.winehq.org/git/wine.git/?a=commit;h=09e98be24350a7a8306cc6cd7302f94eae770afc
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed May 31 17:30:52 2017 +0200
rpcrt4: Wait for server threads to finish in RpcMgmtWaitServerListen.
This fixes races when stopping manual listen RPC servers. It should fix
races in Office applications as well as our services.exe (visible as CS
error on prefix shutdown).
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/rpcrt4/rpc_server.c | 25 ++++++++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/dlls/rpcrt4/rpc_server.c b/dlls/rpcrt4/rpc_server.c
index bd47de6..c350c59 100644
--- a/dlls/rpcrt4/rpc_server.c
+++ b/dlls/rpcrt4/rpc_server.c
@@ -1542,7 +1542,8 @@ RPC_STATUS WINAPI RpcServerListen( UINT MinimumCallThreads, UINT MaxCalls, UINT
*/
RPC_STATUS WINAPI RpcMgmtWaitServerListen( void )
{
- HANDLE event;
+ RpcServerProtseq *protseq;
+ HANDLE event, wait_thread;
TRACE("()\n");
@@ -1558,6 +1559,28 @@ RPC_STATUS WINAPI RpcMgmtWaitServerListen( void )
TRACE( "done waiting\n" );
EnterCriticalSection(&listen_cs);
+ /* wait for server threads to finish */
+ while(1)
+ {
+ if (listen_count)
+ break;
+
+ wait_thread = NULL;
+ EnterCriticalSection(&server_cs);
+ LIST_FOR_EACH_ENTRY(protseq, &protseqs, RpcServerProtseq, entry)
+ {
+ if ((wait_thread = protseq->server_thread))
+ break;
+ }
+ LeaveCriticalSection(&server_cs);
+ if (!wait_thread)
+ break;
+
+ TRACE("waiting for thread %u\n", GetThreadId(wait_thread));
+ LeaveCriticalSection(&listen_cs);
+ WaitForSingleObject(wait_thread, INFINITE);
+ EnterCriticalSection(&listen_cs);
+ }
if (listen_done_event == event)
{
listen_done_event = NULL;
More information about the wine-cvs
mailing list