Dan Hipschman wrote:
@@ -94,7 +95,8 @@ struct connection_ops {
   RpcConnection *(*alloc)(void);
   RPC_STATUS (*open_connection_client)(RpcConnection *conn);
   RPC_STATUS (*handoff)(RpcConnection *old_conn, RpcConnection *new_conn);
-  int (*read)(RpcConnection *conn, void *buffer, unsigned int len);
+  int (*read)(RpcConnection *conn, void *buffer, unsigned int len, BOOL 
check_stop_event);
+  int (*signal_to_stop)(RpcConnection *conn);
   int (*write)(RpcConnection *conn, const void *buffer, unsigned int len);
   int (*close)(RpcConnection *conn);
   size_t (*get_top_of_tower)(unsigned char *tower_data, const char 
*networkaddr, const char *endpoint);

Hmm, I'm not sure it needs to be this complicated.

   HeapFree(GetProcessHeap(), 0, msg);
 }
-static DWORD CALLBACK RPCRT4_worker_thread(LPVOID the_arg)
-{
-  RpcPacket *pkt = the_arg;
-  RPCRT4_process_packet(pkt->conn, pkt->hdr, pkt->msg);
-  HeapFree(GetProcessHeap(), 0, pkt);
-  return 0;
-}
-
 static DWORD CALLBACK RPCRT4_io_thread(LPVOID the_arg)
 {
   RpcConnection* conn = (RpcConnection*)the_arg;
@@ -319,10 +322,14 @@ static DWORD CALLBACK RPCRT4_io_thread(LPVOID the_arg)
   RpcBinding *pbind;
   RPC_MESSAGE *msg;
   RPC_STATUS status;
-  RpcPacket *packet;
TRACE("(%p)\n", conn); + EnterCriticalSection(&client_connections_cs);
+  list_add_head(&client_connections, &conn->client_entry);
+  ResetEvent(clients_completed_event);
+  LeaveCriticalSection(&client_connections_cs);
+
   for (;;) {
     msg = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(RPC_MESSAGE));
@@ -338,17 +345,17 @@ static DWORD CALLBACK RPCRT4_io_thread(LPVOID the_arg)
       break;
     }
-#if 0
     RPCRT4_process_packet(conn, hdr, msg);
-#else
-    packet = HeapAlloc(GetProcessHeap(), 0, sizeof(RpcPacket));
-    packet->conn = conn;
-    packet->hdr = hdr;
-    packet->msg = msg;
-    QueueUserWorkItem(RPCRT4_worker_thread, packet, WT_EXECUTELONGFUNCTION);
-#endif
-    msg = NULL;
   }
+
+  EnterCriticalSection(&client_connections_cs);
+  list_remove(&conn->client_entry);
+  if (list_empty(&client_connections)) {
+    TRACE("last in the list to complete (%p)\n", conn);
+    SetEvent(clients_completed_event);
+  }
+  LeaveCriticalSection(&client_connections_cs);
+
   RPCRT4_DestroyConnection(conn);
   return 0;
 }

I'm not sure your reasoning for doing this. If I'm not mistaken, this change makes it so that only one RPC call at a time is processed.

--
Rob Shearman



Reply via email to