[ros-diffs] [fireball] 31715: - Apply adapted patch by Damjan Jovanovic <damjan.jov at 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.

fireball at svn.reactos.org fireball at svn.reactos.org
Fri Jan 11 14:13:05 CET 2008


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 at 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_server.c?rev=31715&r1=31714&r2=31715&view=diff
==============================================================================
--- 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_transport.c?rev=31715&r1=31714&r2=31715&view=diff
==============================================================================
--- 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_ros.diff?rev=31715&r1=31714&r2=31715&view=diff
==============================================================================
--- 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;




More information about the Ros-diffs mailing list