Added optional debugging code in object management.
diff --git a/server/main.c b/server/main.c
index 31cb488..fe70c32 100644
--- a/server/main.c
+++ b/server/main.c
@@ -29,6 +29,11 @@
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 2b86b13..e036392 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 @@
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 @@
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 @@
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 165da2d..a9f780f 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 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_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 */