Added optional debugging code in object management.
This commit is contained in:
parent
54a39e253c
commit
1bdd154b6b
|
@ -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:
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
Loading…
Reference in New Issue