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.