From 9e388b65812028a63c3e69df03e90d320ed79819 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Fri, 11 Jan 2008 13:13:05 +0000 Subject: [PATCH] - Apply adapted patch by Damjan Jovanovic "Make RpcMgmtWaitServerListen wait for the server to stop listening, like it is supposed to". Rob Shearman commented that "it prevented the dispatching of simultaneous RPCs on an endpoint", however it's enough for ReactOS for now, until a better patch is made. - Uncomment commented out error checks. - Update rpcrt4_ros.diff accordingly. svn path=/trunk/; revision=31715 --- reactos/dll/win32/rpcrt4_new/rpc_server.c | 16 ++++++-- reactos/dll/win32/rpcrt4_new/rpc_transport.c | 4 +- reactos/dll/win32/rpcrt4_new/rpcrt4_ros.diff | 43 ++++++++++++++++++-- 3 files changed, 53 insertions(+), 10 deletions(-) diff --git a/reactos/dll/win32/rpcrt4_new/rpc_server.c b/reactos/dll/win32/rpcrt4_new/rpc_server.c index 34c71c78c5c..02d13988e24 100644 --- a/reactos/dll/win32/rpcrt4_new/rpc_server.c +++ b/reactos/dll/win32/rpcrt4_new/rpc_server.c @@ -1019,7 +1019,7 @@ RPC_STATUS WINAPI RpcServerListen( UINT MinimumCallThreads, UINT MaxCalls, UINT */ RPC_STATUS WINAPI RpcMgmtWaitServerListen( void ) { - TRACE("()\n"); + RpcServerProtseq *cps; EnterCriticalSection(&listen_cs); @@ -1027,10 +1027,18 @@ RPC_STATUS WINAPI RpcMgmtWaitServerListen( void ) LeaveCriticalSection(&listen_cs); return RPC_S_NOT_LISTENING; } - - LeaveCriticalSection(&listen_cs); - FIXME("not waiting for server calls to finish\n"); + do + { + LeaveCriticalSection(&listen_cs); + + LIST_FOR_EACH_ENTRY(cps, &protseqs, RpcServerProtseq, entry) + WaitForSingleObject(cps->server_ready_event, INFINITE); + + EnterCriticalSection(&listen_cs); + } while (!std_listen); + + LeaveCriticalSection(&listen_cs); return RPC_S_OK; } diff --git a/reactos/dll/win32/rpcrt4_new/rpc_transport.c b/reactos/dll/win32/rpcrt4_new/rpc_transport.c index b8e4ee91388..7665ef79358 100644 --- a/reactos/dll/win32/rpcrt4_new/rpc_transport.c +++ b/reactos/dll/win32/rpcrt4_new/rpc_transport.c @@ -375,7 +375,7 @@ static int rpcrt4_conn_np_read(RpcConnection *Connection, break; ret = GetOverlappedResult(npc->pipe, &npc->ovl[0], &bytes_read, TRUE); - if (!ret /*&& GetLastError() != ERROR_MORE_DATA*/) + if (!ret && GetLastError() != ERROR_MORE_DATA) break; bytes_left -= bytes_read; @@ -400,7 +400,7 @@ static int rpcrt4_conn_np_write(RpcConnection *Connection, break; ret = GetOverlappedResult(npc->pipe, &npc->ovl[1], &bytes_written, TRUE); - if (!ret /*&& GetLastError() != ERROR_MORE_DATA*/) + if (!ret && GetLastError() != ERROR_MORE_DATA) break; bytes_left -= bytes_written; diff --git a/reactos/dll/win32/rpcrt4_new/rpcrt4_ros.diff b/reactos/dll/win32/rpcrt4_new/rpcrt4_ros.diff index 2a76e462b92..c6b3943bd4a 100644 --- a/reactos/dll/win32/rpcrt4_new/rpcrt4_ros.diff +++ b/reactos/dll/win32/rpcrt4_new/rpcrt4_ros.diff @@ -1,5 +1,40 @@ ---- H:\Working Copies\wine\dlls\rpcrt4\rpc_transport.c Sun Jan 06 19:27:38 2008 -+++ H:\Working Copies\ReactOS\trunk\reactos\dll\win32\rpcrt4\rpc_transport.c Mon Jan 07 16:02:15 2008 +--- rpc_server.c Tue Jan 01 13:09:34 2008 ++++ rpc_server.c Fri Jan 11 15:58:57 2008 +@@ -1017,22 +1017,30 @@ + /*********************************************************************** + * RpcMgmtServerWaitListen (RPCRT4.@) + */ + RPC_STATUS WINAPI RpcMgmtWaitServerListen( void ) + { +- TRACE("()\n"); ++ RpcServerProtseq *cps; + + EnterCriticalSection(&listen_cs); + + if (!std_listen) { + LeaveCriticalSection(&listen_cs); + return RPC_S_NOT_LISTENING; + } + ++ do ++ { + LeaveCriticalSection(&listen_cs); + +- FIXME("not waiting for server calls to finish\n"); ++ LIST_FOR_EACH_ENTRY(cps, &protseqs, RpcServerProtseq, entry) ++ WaitForSingleObject(cps->server_ready_event, INFINITE); ++ ++ EnterCriticalSection(&listen_cs); ++ } while (!std_listen); ++ ++ LeaveCriticalSection(&listen_cs); + + return RPC_S_OK; + } + + /*********************************************************************** +--- rpc_transport.c Sun Jan 06 19:27:38 2008 ++++ rpc_transport.c Fri Jan 11 15:59:32 2008 @@ -54,10 +54,13 @@ #endif #ifdef HAVE_SYS_POLL_H @@ -127,7 +162,7 @@ break; + + ret = GetOverlappedResult(npc->pipe, &npc->ovl[0], &bytes_read, TRUE); -+ if (!ret /*&& GetLastError() != ERROR_MORE_DATA*/) ++ if (!ret && GetLastError() != ERROR_MORE_DATA) + break; + bytes_left -= bytes_read; @@ -148,7 +183,7 @@ break; + + ret = GetOverlappedResult(npc->pipe, &npc->ovl[1], &bytes_written, TRUE); -+ if (!ret /*&& GetLastError() != ERROR_MORE_DATA*/) ++ if (!ret && GetLastError() != ERROR_MORE_DATA) + break; + bytes_left -= bytes_written;