From d15f47412effbcb20105d87e94f3a114e0e26449 Mon Sep 17 00:00:00 2001
From: Alexandre Julliard <julliard@winehq.org>
Date: Thu, 21 Jan 2016 21:08:56 +0900
Subject: [PATCH] server: Always print the full path of objects when dumping
 them.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
---
 server/completion.c |  4 +---
 server/device.c     |  6 +-----
 server/directory.c  | 12 ++----------
 server/event.c      | 10 ++--------
 server/handle.c     |  1 +
 server/mailslot.c   |  3 +--
 server/mapping.c    |  4 +---
 server/mutex.c      |  4 +---
 server/named_pipe.c |  9 ++-------
 server/object.c     | 24 +++++++++++++++++-------
 server/semaphore.c  |  4 +---
 server/symlink.c    |  6 ++----
 server/timer.c      |  4 +---
 server/winstation.c |  8 ++------
 14 files changed, 35 insertions(+), 64 deletions(-)

diff --git a/server/completion.c b/server/completion.c
index a93551f9e3f..e0654766afa 100644
--- a/server/completion.c
+++ b/server/completion.c
@@ -102,9 +102,7 @@ static void completion_dump( struct object *obj, int verbose )
     struct completion *completion = (struct completion *) obj;
 
     assert( obj->ops == &completion_ops );
-    fprintf( stderr, "Completion " );
-    dump_object_name( &completion->obj );
-    fprintf( stderr, " (%u packets pending)\n", completion->depth );
+    fprintf( stderr, "Completion depth=%u", completion->depth );
 }
 
 static struct object_type *completion_get_type( struct object *obj )
diff --git a/server/device.c b/server/device.c
index fb91c021116..b35f2e7b686 100644
--- a/server/device.c
+++ b/server/device.c
@@ -314,11 +314,7 @@ static void set_irp_result( struct irp_call *irp, unsigned int status,
 
 static void device_dump( struct object *obj, int verbose )
 {
-    struct device *device = (struct device *)obj;
-
-    fprintf( stderr, "Device " );
-    dump_object_name( &device->obj );
-    fputc( '\n', stderr );
+    fputs( "Device\n", stderr );
 }
 
 static struct object_type *device_get_type( struct object *obj )
diff --git a/server/directory.c b/server/directory.c
index 9369e78c4f4..de049ef7d09 100644
--- a/server/directory.c
+++ b/server/directory.c
@@ -108,11 +108,7 @@ static struct directory *dir_objtype;
 
 static void object_type_dump( struct object *obj, int verbose )
 {
-    assert( obj->ops == &object_type_ops );
-
-    fputs( "Object type ", stderr );
-    dump_object_name( obj );
-    fputc( '\n', stderr );
+    fputs( "Object type\n", stderr );
 }
 
 static struct object_type *object_type_get_type( struct object *obj )
@@ -124,11 +120,7 @@ static struct object_type *object_type_get_type( struct object *obj )
 
 static void directory_dump( struct object *obj, int verbose )
 {
-    assert( obj->ops == &directory_ops );
-
-    fputs( "Directory ", stderr );
-    dump_object_name( obj );
-    fputc( '\n', stderr );
+    fputs( "Directory\n", stderr );
 }
 
 static struct object_type *directory_get_type( struct object *obj )
diff --git a/server/event.c b/server/event.c
index 591f1e2df64..5b2bfc94dfc 100644
--- a/server/event.c
+++ b/server/event.c
@@ -153,10 +153,8 @@ static void event_dump( struct object *obj, int verbose )
 {
     struct event *event = (struct event *)obj;
     assert( obj->ops == &event_ops );
-    fprintf( stderr, "Event manual=%d signaled=%d ",
+    fprintf( stderr, "Event manual=%d signaled=%d\n",
              event->manual_reset, event->signaled );
-    dump_object_name( &event->obj );
-    fputc( '\n', stderr );
 }
 
 static struct object_type *event_get_type( struct object *obj )
@@ -230,11 +228,7 @@ struct keyed_event *get_keyed_event_obj( struct process *process, obj_handle_t h
 
 static void keyed_event_dump( struct object *obj, int verbose )
 {
-    struct keyed_event *event = (struct keyed_event *)obj;
-    assert( obj->ops == &keyed_event_ops );
-    fprintf( stderr, "Keyed event " );
-    dump_object_name( &event->obj );
-    fputc( '\n', stderr );
+    fputs( "Keyed event\n", stderr );
 }
 
 static struct object_type *keyed_event_get_type( struct object *obj )
diff --git a/server/handle.c b/server/handle.c
index 05d71bac386..10ed4c695fa 100644
--- a/server/handle.c
+++ b/server/handle.c
@@ -153,6 +153,7 @@ static void handle_table_dump( struct object *obj, int verbose )
         if (!entry->ptr) continue;
         fprintf( stderr, "    %04x: %p %08x ",
                  index_to_handle(i), entry->ptr, entry->access );
+        dump_object_name( entry->ptr );
         entry->ptr->ops->dump( entry->ptr, 0 );
     }
 }
diff --git a/server/mailslot.c b/server/mailslot.c
index cb9510c0eff..0d93f42057a 100644
--- a/server/mailslot.c
+++ b/server/mailslot.c
@@ -325,8 +325,7 @@ static void mailslot_queue_async( struct fd *fd, const async_data_t *data, int t
 
 static void mailslot_device_dump( struct object *obj, int verbose )
 {
-    assert( obj->ops == &mailslot_device_ops );
-    fprintf( stderr, "Mail slot device\n" );
+    fputs( "Mailslot device\n", stderr );
 }
 
 static struct object_type *mailslot_device_get_type( struct object *obj )
diff --git a/server/mapping.c b/server/mapping.c
index e206dea8eec..f66f326edea 100644
--- a/server/mapping.c
+++ b/server/mapping.c
@@ -604,12 +604,10 @@ static void mapping_dump( struct object *obj, int verbose )
     struct mapping *mapping = (struct mapping *)obj;
     assert( obj->ops == &mapping_ops );
     fprintf( stderr, "Mapping size=%08x%08x prot=%08x fd=%p header_size=%08x base=%08lx "
-             "shared_file=%p ",
+             "shared_file=%p\n",
              (unsigned int)(mapping->size >> 32), (unsigned int)mapping->size,
              mapping->protect, mapping->fd, mapping->header_size,
              (unsigned long)mapping->base, mapping->shared_file );
-    dump_object_name( &mapping->obj );
-    fputc( '\n', stderr );
 }
 
 static struct object_type *mapping_get_type( struct object *obj )
diff --git a/server/mutex.c b/server/mutex.c
index 98490e00e4b..fe94674e65f 100644
--- a/server/mutex.c
+++ b/server/mutex.c
@@ -138,9 +138,7 @@ static void mutex_dump( struct object *obj, int verbose )
 {
     struct mutex *mutex = (struct mutex *)obj;
     assert( obj->ops == &mutex_ops );
-    fprintf( stderr, "Mutex count=%u owner=%p ", mutex->count, mutex->owner );
-    dump_object_name( &mutex->obj );
-    fputc( '\n', stderr );
+    fprintf( stderr, "Mutex count=%u owner=%p\n", mutex->count, mutex->owner );
 }
 
 static struct object_type *mutex_get_type( struct object *obj )
diff --git a/server/named_pipe.c b/server/named_pipe.c
index 870192d67e9..aa527aa0581 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -269,11 +269,7 @@ static const struct fd_ops named_pipe_device_fd_ops =
 
 static void named_pipe_dump( struct object *obj, int verbose )
 {
-    struct named_pipe *pipe = (struct named_pipe *) obj;
-    assert( obj->ops == &named_pipe_ops );
-    fprintf( stderr, "Named pipe " );
-    dump_object_name( &pipe->obj );
-    fprintf( stderr, "\n" );
+    fputs( "Named pipe\n", stderr );
 }
 
 static unsigned int named_pipe_map_access( struct object *obj, unsigned int access )
@@ -443,8 +439,7 @@ static void pipe_client_destroy( struct object *obj)
 
 static void named_pipe_device_dump( struct object *obj, int verbose )
 {
-    assert( obj->ops == &named_pipe_device_ops );
-    fprintf( stderr, "Named pipe device\n" );
+    fputs( "Named pipe device\n", stderr );
 }
 
 static struct object_type *named_pipe_device_get_type( struct object *obj )
diff --git a/server/object.c b/server/object.c
index 31883bdcd09..1ec547a58b3 100644
--- a/server/object.c
+++ b/server/object.c
@@ -68,12 +68,14 @@ void dump_objects(void)
     {
         struct object *ptr = LIST_ENTRY( p, struct object, obj_list );
         fprintf( stderr, "%p:%d: ", ptr, ptr->refcount );
+        dump_object_name( ptr );
         ptr->ops->dump( ptr, 1 );
     }
     LIST_FOR_EACH( p, &object_list )
     {
         struct object *ptr = LIST_ENTRY( p, struct object, obj_list );
         fprintf( stderr, "%p:%d: ", ptr, ptr->refcount );
+        dump_object_name( ptr );
         ptr->ops->dump( ptr, 1 );
     }
 }
@@ -267,16 +269,24 @@ void *create_named_object( struct namespace *namespace, const struct object_ops
     return obj;
 }
 
+/* recursive helper for dump_object_name */
+static void dump_name( struct object *obj )
+{
+    struct object_name *name = obj->name;
+
+    if (!name) return;
+    if (name->parent) dump_name( name->parent );
+    fputs( "\\\\", stderr );
+    dump_strW( name->name, name->len / sizeof(WCHAR), stderr, "[]" );
+}
+
 /* dump the name of an object to stderr */
 void dump_object_name( struct object *obj )
 {
-    if (!obj->name) fprintf( stderr, "name=\"\"" );
-    else
-    {
-        fprintf( stderr, "name=L\"" );
-        dump_strW( obj->name->name, obj->name->len/sizeof(WCHAR), stderr, "\"\"" );
-        fputc( '\"', stderr );
-    }
+    if (!obj->name) return;
+    fputc( '[', stderr );
+    dump_name( obj );
+    fputs( "] ", stderr );
 }
 
 /* unlink a named object from its namespace, without freeing the object itself */
diff --git a/server/semaphore.c b/server/semaphore.c
index a9786b13609..8c594a4aa7a 100644
--- a/server/semaphore.c
+++ b/server/semaphore.c
@@ -124,9 +124,7 @@ static void semaphore_dump( struct object *obj, int verbose )
 {
     struct semaphore *sem = (struct semaphore *)obj;
     assert( obj->ops == &semaphore_ops );
-    fprintf( stderr, "Semaphore count=%d max=%d ", sem->count, sem->max );
-    dump_object_name( &sem->obj );
-    fputc( '\n', stderr );
+    fprintf( stderr, "Semaphore count=%d max=%d\n", sem->count, sem->max );
 }
 
 static struct object_type *semaphore_get_type( struct object *obj )
diff --git a/server/symlink.c b/server/symlink.c
index abc34f2aaaa..6710133e4dd 100644
--- a/server/symlink.c
+++ b/server/symlink.c
@@ -77,11 +77,9 @@ static void symlink_dump( struct object *obj, int verbose )
     struct symlink *symlink = (struct symlink *)obj;
     assert( obj->ops == &symlink_ops );
 
-    fprintf( stderr, "Symlink " );
-    dump_object_name( obj );
-    fprintf( stderr, " -> L\"" );
+    fputs( "Symlink target=\"", stderr );
     dump_strW( symlink->target, symlink->len / sizeof(WCHAR), stderr, "\"\"" );
-    fprintf( stderr, "\"\n" );
+    fputs( "\"\n", stderr );
 }
 
 static struct object_type *symlink_get_type( struct object *obj )
diff --git a/server/timer.c b/server/timer.c
index 2c0522cbd2a..2f6f6070e12 100644
--- a/server/timer.c
+++ b/server/timer.c
@@ -184,10 +184,8 @@ static void timer_dump( struct object *obj, int verbose )
 {
     struct timer *timer = (struct timer *)obj;
     assert( obj->ops == &timer_ops );
-    fprintf( stderr, "Timer manual=%d when=%s period=%u ",
+    fprintf( stderr, "Timer manual=%d when=%s period=%u\n",
              timer->manual, get_timeout_str(timer->when), timer->period );
-    dump_object_name( &timer->obj );
-    fputc( '\n', stderr );
 }
 
 static struct object_type *timer_get_type( struct object *obj )
diff --git a/server/winstation.c b/server/winstation.c
index 7a6b9fce630..62d780fa432 100644
--- a/server/winstation.c
+++ b/server/winstation.c
@@ -133,10 +133,8 @@ static void winstation_dump( struct object *obj, int verbose )
 {
     struct winstation *winstation = (struct winstation *)obj;
 
-    fprintf( stderr, "Winstation flags=%x clipboard=%p atoms=%p ",
+    fprintf( stderr, "Winstation flags=%x clipboard=%p atoms=%p\n",
              winstation->flags, winstation->clipboard, winstation->atom_table );
-    dump_object_name( &winstation->obj );
-    fputc( '\n', stderr );
 }
 
 static struct object_type *winstation_get_type( struct object *obj )
@@ -223,10 +221,8 @@ static void desktop_dump( struct object *obj, int verbose )
 {
     struct desktop *desktop = (struct desktop *)obj;
 
-    fprintf( stderr, "Desktop flags=%x winstation=%p top_win=%p hooks=%p ",
+    fprintf( stderr, "Desktop flags=%x winstation=%p top_win=%p hooks=%p\n",
              desktop->flags, desktop->winstation, desktop->top_window, desktop->global_hooks );
-    dump_object_name( &desktop->obj );
-    fputc( '\n', stderr );
 }
 
 static struct object_type *desktop_get_type( struct object *obj )
-- 
GitLab