Added separate server pipe to wait on blocking server calls.
Send the complete request/reply through the request fifo instead of
just a dummy byte.
Convert error status to text in server reply tracing.
diff --git a/server/trace.c b/server/trace.c
index f8bafa6..61f8378 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -550,11 +550,6 @@
cur_pos += dump_varargs_handles( req );
}
-static void dump_select_reply( const struct select_request *req )
-{
- fprintf( stderr, " signaled=%d", req->signaled );
-}
-
static void dump_create_event_request( const struct create_event_request *req )
{
fprintf( stderr, " manual_reset=%d,", req->manual_reset );
@@ -1625,7 +1620,7 @@
(dump_func)dump_set_handle_info_reply,
(dump_func)dump_dup_handle_reply,
(dump_func)dump_open_process_reply,
- (dump_func)dump_select_reply,
+ (dump_func)0,
(dump_func)dump_create_event_reply,
(dump_func)0,
(dump_func)dump_open_event_reply,
@@ -1827,33 +1822,90 @@
/* ### make_requests end ### */
/* Everything above this line is generated automatically by tools/make_requests */
-void trace_request( enum request req )
+static const char *get_status_name( unsigned int status )
{
+#define NAME(status) { #status, STATUS_##status }
+ static const struct
+ {
+ const char *name;
+ unsigned int value;
+ } status_names[] =
+ {
+ NAME(ACCESS_DENIED),
+ NAME(ACCESS_VIOLATION),
+ NAME(BUFFER_OVERFLOW),
+ NAME(CHILD_MUST_BE_VOLATILE),
+ NAME(DIRECTORY_NOT_EMPTY),
+ NAME(DISK_FULL),
+ NAME(FILE_LOCK_CONFLICT),
+ NAME(INVALID_FILE_FOR_SECTION),
+ NAME(INVALID_HANDLE),
+ NAME(INVALID_PARAMETER),
+ NAME(KEY_DELETED),
+ NAME(MEDIA_WRITE_PROTECTED),
+ NAME(MUTANT_NOT_OWNED),
+ NAME(NOT_REGISTRY_FILE),
+ NAME(NO_MEMORY),
+ NAME(NO_MORE_ENTRIES),
+ NAME(NO_MORE_FILES),
+ NAME(NO_SUCH_FILE),
+ NAME(OBJECT_NAME_COLLISION),
+ NAME(OBJECT_NAME_INVALID),
+ NAME(OBJECT_NAME_NOT_FOUND),
+ NAME(OBJECT_PATH_INVALID),
+ NAME(OBJECT_TYPE_MISMATCH),
+ NAME(PENDING),
+ NAME(PIPE_BROKEN),
+ NAME(SEMAPHORE_LIMIT_EXCEEDED),
+ NAME(SHARING_VIOLATION),
+ NAME(SUSPEND_COUNT_EXCEEDED),
+ NAME(TIMEOUT),
+ NAME(TOO_MANY_OPENED_FILES),
+ NAME(UNSUCCESSFUL),
+ NAME(USER_APC),
+ { NULL, 0 } /* terminator */
+ };
+#undef NAME
+
+ int i;
+ static char buffer[10];
+
+ if (status)
+ {
+ for (i = 0; status_names[i].name; i++)
+ if (status_names[i].value == status) return status_names[i].name;
+ }
+ sprintf( buffer, "%x", status );
+ return buffer;
+}
+
+void trace_request( struct thread *thread, const union generic_request *request )
+{
+ enum request req = request->header.req;
cur_pos = 0;
current->last_req = req;
if (req < REQ_NB_REQUESTS)
{
- fprintf( stderr, "%08x: %s(", (unsigned int)current, req_names[req] );
+ fprintf( stderr, "%08x: %s(", (unsigned int)thread, req_names[req] );
cur_pos = 0;
- req_dumpers[req]( current->buffer );
+ req_dumpers[req]( request );
}
else
- fprintf( stderr, "%08x: %d(", (unsigned int)current, req );
- if (current->pass_fd != -1) fprintf( stderr, " ) fd=%d\n", current->pass_fd );
+ fprintf( stderr, "%08x: %d(", (unsigned int)thread, req );
+ if (thread->pass_fd != -1) fprintf( stderr, " ) fd=%d\n", thread->pass_fd );
else fprintf( stderr, " )\n" );
}
-void trace_reply( struct thread *thread )
+void trace_reply( struct thread *thread, const union generic_request *request )
{
- fprintf( stderr, "%08x: %s() = %x",
- (unsigned int)thread, req_names[thread->last_req], thread->error );
+ fprintf( stderr, "%08x: %s() = %s",
+ (unsigned int)thread, req_names[thread->last_req], get_status_name(thread->error) );
if (reply_dumpers[thread->last_req])
{
fprintf( stderr, " {" );
cur_pos = 0;
- reply_dumpers[thread->last_req]( thread->buffer );
+ reply_dumpers[thread->last_req]( request );
fprintf( stderr, " }" );
}
- if (thread->pass_fd != -1) fprintf( stderr, " fd=%d\n", thread->pass_fd );
- else fprintf( stderr, "\n" );
+ fputc( '\n', stderr );
}