Create the server pipes on the client side and transfer them to the
server on thread creation.
Use a single per-process socket instead of one per thread for
transferring file handles between client and server.
diff --git a/server/trace.c b/server/trace.c
index 744bc84..14fa6f2 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -299,7 +299,8 @@
static void dump_new_thread_request( const struct new_thread_request *req )
{
fprintf( stderr, " suspend=%d,", req->suspend );
- fprintf( stderr, " inherit=%d", req->inherit );
+ fprintf( stderr, " inherit=%d,", req->inherit );
+ fprintf( stderr, " request_fd=%d", req->request_fd );
}
static void dump_new_thread_reply( const struct new_thread_request *req )
@@ -351,14 +352,12 @@
{
fprintf( stderr, " unix_pid=%d,", req->unix_pid );
fprintf( stderr, " teb=%p,", req->teb );
- fprintf( stderr, " entry=%p", req->entry );
+ fprintf( stderr, " entry=%p,", req->entry );
+ fprintf( stderr, " reply_fd=%d,", req->reply_fd );
+ fprintf( stderr, " wait_fd=%d", req->wait_fd );
}
-static void dump_get_thread_buffer_request( const struct get_thread_buffer_request *req )
-{
-}
-
-static void dump_get_thread_buffer_reply( const struct get_thread_buffer_request *req )
+static void dump_init_thread_reply( const struct init_thread_request *req )
{
fprintf( stderr, " pid=%p,", req->pid );
fprintf( stderr, " tid=%p,", req->tid );
@@ -366,6 +365,17 @@
fprintf( stderr, " version=%d", req->version );
}
+static void dump_set_thread_buffer_request( const struct set_thread_buffer_request *req )
+{
+ fprintf( stderr, " fd=%d", req->fd );
+}
+
+static void dump_set_thread_buffer_reply( const struct set_thread_buffer_request *req )
+{
+ fprintf( stderr, " offset=%08x,", req->offset );
+ fprintf( stderr, " size=%08x", req->size );
+}
+
static void dump_terminate_process_request( const struct terminate_process_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
@@ -1492,7 +1502,7 @@
(dump_func)dump_init_process_request,
(dump_func)dump_init_process_done_request,
(dump_func)dump_init_thread_request,
- (dump_func)dump_get_thread_buffer_request,
+ (dump_func)dump_set_thread_buffer_request,
(dump_func)dump_terminate_process_request,
(dump_func)dump_terminate_thread_request,
(dump_func)dump_get_process_info_request,
@@ -1603,8 +1613,8 @@
(dump_func)0,
(dump_func)dump_init_process_reply,
(dump_func)dump_init_process_done_reply,
- (dump_func)0,
- (dump_func)dump_get_thread_buffer_reply,
+ (dump_func)dump_init_thread_reply,
+ (dump_func)dump_set_thread_buffer_reply,
(dump_func)dump_terminate_process_reply,
(dump_func)dump_terminate_thread_reply,
(dump_func)dump_get_process_info_reply,
@@ -1716,7 +1726,7 @@
"init_process",
"init_process_done",
"init_thread",
- "get_thread_buffer",
+ "set_thread_buffer",
"terminate_process",
"terminate_thread",
"get_process_info",
@@ -1884,7 +1894,6 @@
{
enum request req = request->header.req;
cur_pos = 0;
- current->last_req = req;
if (req < REQ_NB_REQUESTS)
{
fprintf( stderr, "%08x: %s(", (unsigned int)thread, req_names[req] );
@@ -1897,14 +1906,20 @@
void trace_reply( struct thread *thread, const union generic_request *request )
{
- fprintf( stderr, "%08x: %s() = %s",
- (unsigned int)thread, req_names[thread->last_req], get_status_name(thread->error) );
- if (reply_dumpers[thread->last_req])
+ enum request req = request->header.req;
+ if (req < REQ_NB_REQUESTS)
{
- fprintf( stderr, " {" );
- cur_pos = 0;
- reply_dumpers[thread->last_req]( request );
- fprintf( stderr, " }" );
+ fprintf( stderr, "%08x: %s() = %s",
+ (unsigned int)thread, req_names[req], get_status_name(thread->error) );
+ if (reply_dumpers[req])
+ {
+ fprintf( stderr, " {" );
+ cur_pos = 0;
+ reply_dumpers[req]( request );
+ fprintf( stderr, " }" );
+ }
+ fputc( '\n', stderr );
}
- fputc( '\n', stderr );
+ else fprintf( stderr, "%08x: %d() = %s\n",
+ (unsigned int)thread, req, get_status_name(thread->error) );
}