Convert the object wait queue to a standard list.

diff --git a/server/fd.c b/server/fd.c
index c4c4445..ed95a74 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -1324,7 +1324,7 @@
     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 @@
 
     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 @@
 
     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 f1ae018..91959b6 100644
--- a/server/object.c
+++ b/server/object.c
@@ -137,9 +137,8 @@
     {
         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 @@
     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 c42b49c..23dd4b5 100644
--- a/server/object.h
+++ b/server/object.h
@@ -69,8 +69,7 @@
 {
     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 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 b9027b7..093c94c 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -663,7 +663,7 @@
     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 de23684..a2a232d 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -342,22 +342,15 @@
 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 @@
 /* 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;
         }