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 #include #include +#include #include #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 */