From 1bdd154b6b9e5b2afc945d69b2d9cad7234238b3 Mon Sep 17 00:00:00 2001
From: Alexandre Julliard <julliard@winehq.org>
Date: Fri, 4 Jun 1999 19:47:04 +0000
Subject: [PATCH] Added optional debugging code in object management.

---
 server/main.c   |  5 +++++
 server/object.c | 34 ++++++++++++++++++++++++++++++++++
 server/object.h | 10 ++++++++++
 3 files changed, 49 insertions(+)

diff --git a/server/main.c b/server/main.c
index 31cb48867b6..fe70c32100a 100644
--- a/server/main.c
+++ b/server/main.c
@@ -29,6 +29,11 @@ int main( int argc, char *argv[] )
     if (debug_level) fprintf( stderr, "Server: starting (pid=%d)\n", getpid() );
     create_initial_thread( fd );
     if (debug_level) fprintf( stderr, "Server: exiting (pid=%d)\n", getpid() );
+
+#ifdef DEBUG_OBJECTS
+    dump_objects();  /* dump any remaining objects */
+#endif
+
     exit(0);
 
  error:    
diff --git a/server/object.c b/server/object.c
index 2b86b13a713..e03639279f2 100644
--- a/server/object.c
+++ b/server/object.c
@@ -8,6 +8,7 @@
 #include <assert.h>
 #include <limits.h>
 #include <stdlib.h>
+#include <stdio.h>
 #include <string.h>
 
 #include "winerror.h"
@@ -27,6 +28,21 @@ struct object_name
 
 static struct object_name *names[NAME_HASH_SIZE];
 
+#ifdef DEBUG_OBJECTS
+static struct object *first;
+
+void dump_objects(void)
+{
+    struct object *ptr = first;
+    while (ptr)
+    {
+        fprintf( stderr, "%p:%d: ", ptr, ptr->refcount );
+        ptr->ops->dump( ptr, 1 );
+        ptr = ptr->next;
+    }
+}
+#endif
+
 /*****************************************************************/
 
 void *mem_alloc( size_t size )
@@ -83,9 +99,22 @@ int init_object( struct object *obj, const struct object_ops *ops,
     obj->tail     = NULL;
     if (!name) obj->name = NULL;
     else if (!(obj->name = add_name( obj, name ))) return 0;
+#ifdef DEBUG_OBJECTS
+    obj->prev = NULL;
+    if ((obj->next = first) != NULL) obj->next->prev = obj;
+    first = obj;
+#endif
     return 1;
 }
 
+/* allocate and initialize an object */
+void *alloc_object( size_t size, const struct object_ops *ops, const char *name )
+{
+    struct object *obj = mem_alloc( size );
+    if (obj) init_object( obj, ops, name );
+    return obj;
+}
+
 struct object *create_named_object( const char *name, const struct object_ops *ops, size_t size )
 {
     struct object *obj;
@@ -136,6 +165,11 @@ void release_object( void *ptr )
         assert( !obj->head );
         assert( !obj->tail );
         if (obj->name) free_name( obj );
+#ifdef DEBUG_OBJECTS
+        if (obj->next) obj->next->prev = obj->prev;
+        if (obj->prev) obj->prev->next = obj->next;
+        else first = obj->next;
+#endif
         obj->ops->destroy( obj );
     }
 }
diff --git a/server/object.h b/server/object.h
index 165da2df77f..a9f780fdb1a 100644
--- a/server/object.h
+++ b/server/object.h
@@ -15,6 +15,8 @@
 #include "server.h"
 #include "server/request.h"
 
+#define DEBUG_OBJECTS
+
 /* kernel objects */
 
 struct object;
@@ -56,9 +58,14 @@ struct object
     struct wait_queue_entry  *head;
     struct wait_queue_entry  *tail;
     struct object_name       *name;
+#ifdef DEBUG_OBJECTS
+    struct object            *prev;
+    struct object            *next;
+#endif
 };
 
 extern void *mem_alloc( size_t size );  /* malloc wrapper */
+extern void *alloc_object( size_t size, const struct object_ops *ops, const char *name );
 extern struct object *create_named_object( const char *name, const struct object_ops *ops,
                                            size_t size );
 extern int init_object( struct object *obj, const struct object_ops *ops, const char *name );
@@ -75,6 +82,9 @@ extern int no_write_fd( struct object *obj );
 extern int no_flush( struct object *obj );
 extern int no_get_file_info( struct object *obj, struct get_file_info_reply *info );
 extern void default_select_event( int event, void *private );
+#ifdef DEBUG_OBJECTS
+extern void dump_objects(void);
+#endif
 
 /* request handlers */
 
-- 
GitLab