From aa34768677143bc28ff58524224c5b17adbccfb3 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 1 Mar 2005 11:49:58 +0000 Subject: [PATCH] Convert the object wait queue to a standard list. --- server/fd.c | 6 +++--- server/object.c | 6 ++---- server/object.h | 10 ++++------ server/queue.c | 2 +- server/thread.c | 22 +++++++--------------- 5 files changed, 17 insertions(+), 29 deletions(-) diff --git a/server/fd.c b/server/fd.c index c4c44459ffd..ed95a745515 100644 --- a/server/fd.c +++ b/server/fd.c @@ -1324,7 +1324,7 @@ int default_fd_add_queue( struct object *obj, struct wait_queue_entry *entry ) struct fd *fd = get_obj_fd( obj ); if (!fd) return 0; - if (!obj->head) /* first on the queue */ + if (list_empty( &obj->wait_queue )) /* first on the queue */ set_fd_events( fd, fd->fd_ops->get_poll_events( fd ) ); add_queue( obj, entry ); release_object( fd ); @@ -1338,7 +1338,7 @@ void default_fd_remove_queue( struct object *obj, struct wait_queue_entry *entry grab_object( obj ); remove_queue( obj, entry ); - if (!obj->head) /* last on the queue is gone */ + if (list_empty( &obj->wait_queue )) /* last on the queue is gone */ set_fd_events( fd, 0 ); release_object( obj ); release_object( fd ); @@ -1357,7 +1357,7 @@ int default_fd_signaled( struct object *obj, struct thread *thread ) if (ret) set_fd_events( fd, 0 ); /* stop waiting on select() if we are signaled */ - else if (obj->head) + else if (!list_empty( &obj->wait_queue )) set_fd_events( fd, events ); /* restart waiting on poll() if we are no longer signaled */ release_object( fd ); diff --git a/server/object.c b/server/object.c index f1ae018c04d..91959b65c5a 100644 --- a/server/object.c +++ b/server/object.c @@ -137,9 +137,8 @@ void *alloc_object( const struct object_ops *ops ) { obj->refcount = 1; obj->ops = ops; - obj->head = NULL; - obj->tail = NULL; obj->name = NULL; + list_init( &obj->wait_queue ); #ifdef DEBUG_OBJECTS list_add_head( &object_list, &obj->obj_list ); #endif @@ -205,8 +204,7 @@ void release_object( void *ptr ) if (!--obj->refcount) { /* if the refcount is 0, nobody can be in the wait queue */ - assert( !obj->head ); - assert( !obj->tail ); + assert( list_empty( &obj->wait_queue )); obj->ops->destroy( obj ); if (obj->name) free_name( obj ); #ifdef DEBUG_OBJECTS diff --git a/server/object.h b/server/object.h index c42b49c8408..23dd4b58849 100644 --- a/server/object.h +++ b/server/object.h @@ -69,8 +69,7 @@ struct object { unsigned int refcount; /* reference count */ const struct object_ops *ops; - struct wait_queue_entry *head; - struct wait_queue_entry *tail; + struct list wait_queue; struct object_name *name; #ifdef DEBUG_OBJECTS struct list obj_list; @@ -79,10 +78,9 @@ struct object struct wait_queue_entry { - struct wait_queue_entry *next; - struct wait_queue_entry *prev; - struct object *obj; - struct thread *thread; + struct list entry; + struct object *obj; + struct thread *thread; }; extern void *mem_alloc( size_t size ); /* malloc wrapper */ diff --git a/server/queue.c b/server/queue.c index b9027b738b8..093c94c4c16 100644 --- a/server/queue.c +++ b/server/queue.c @@ -663,7 +663,7 @@ static int is_queue_hung( struct msg_queue *queue ) if (now.tv_sec - queue->last_get_msg.tv_sec <= 5) return 0; /* less than 5 seconds since last get message -> not hung */ - for (entry = queue->obj.head; entry; entry = entry->next) + LIST_FOR_EACH_ENTRY( entry, &queue->obj.wait_queue, struct wait_queue_entry, entry ) { if (entry->thread->queue == queue) return 0; /* thread is waiting on queue -> not hung */ diff --git a/server/thread.c b/server/thread.c index de2368450bf..a2a232df4cf 100644 --- a/server/thread.c +++ b/server/thread.c @@ -342,22 +342,15 @@ static int resume_thread( struct thread *thread ) int add_queue( struct object *obj, struct wait_queue_entry *entry ) { grab_object( obj ); - entry->obj = obj; - entry->prev = obj->tail; - entry->next = NULL; - if (obj->tail) obj->tail->next = entry; - else obj->head = entry; - obj->tail = entry; + entry->obj = obj; + list_add_tail( &obj->wait_queue, &entry->entry ); return 1; } /* remove a thread from an object wait queue */ void remove_queue( struct object *obj, struct wait_queue_entry *entry ) { - if (entry->next) entry->next->prev = entry->prev; - else obj->tail = entry->prev; - if (entry->prev) entry->prev->next = entry->next; - else obj->head = entry->next; + list_remove( &entry->entry ); release_object( obj ); } @@ -569,13 +562,12 @@ done: /* attempt to wake threads sleeping on the object wait queue */ void wake_up( struct object *obj, int max ) { - struct wait_queue_entry *entry = obj->head; + struct list *ptr, *next; - while (entry) + LIST_FOR_EACH_SAFE( ptr, next, &obj->wait_queue ) { - struct thread *thread = entry->thread; - entry = entry->next; - if (wake_thread( thread )) + struct wait_queue_entry *entry = LIST_ENTRY( ptr, struct wait_queue_entry, entry ); + if (wake_thread( entry->thread )) { if (max && !--max) break; }