Author: fireball Date: Fri Jan 11 16:13:05 2008 New Revision: 31715
URL: http://svn.reactos.org/svn/reactos?rev=31715&view=rev Log: - Apply adapted patch by Damjan Jovanovic damjan.jov@gmail.com "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.
Modified: trunk/reactos/dll/win32/rpcrt4_new/rpc_server.c trunk/reactos/dll/win32/rpcrt4_new/rpc_transport.c trunk/reactos/dll/win32/rpcrt4_new/rpcrt4_ros.diff
Modified: trunk/reactos/dll/win32/rpcrt4_new/rpc_server.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4_new/rpc_se... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4_new/rpc_server.c (original) +++ trunk/reactos/dll/win32/rpcrt4_new/rpc_server.c Fri Jan 11 16:13:05 2008 @@ -1019,7 +1019,7 @@ */ RPC_STATUS WINAPI RpcMgmtWaitServerListen( void ) { - TRACE("()\n"); + RpcServerProtseq *cps;
EnterCriticalSection(&listen_cs);
@@ -1027,10 +1027,18 @@ LeaveCriticalSection(&listen_cs); return RPC_S_NOT_LISTENING; } - + + 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); - - FIXME("not waiting for server calls to finish\n");
return RPC_S_OK; }
Modified: trunk/reactos/dll/win32/rpcrt4_new/rpc_transport.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4_new/rpc_tr... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4_new/rpc_transport.c (original) +++ trunk/reactos/dll/win32/rpcrt4_new/rpc_transport.c Fri Jan 11 16:13:05 2008 @@ -375,7 +375,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; @@ -400,7 +400,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;
Modified: trunk/reactos/dll/win32/rpcrt4_new/rpcrt4_ros.diff URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/rpcrt4_new/rpcrt4... ============================================================================== --- trunk/reactos/dll/win32/rpcrt4_new/rpcrt4_ros.diff (original) +++ trunk/reactos/dll/win32/rpcrt4_new/rpcrt4_ros.diff Fri Jan 11 16:13:05 2008 @@ -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;