server: Make async I/O queues into real objects.
diff --git a/server/named_pipe.c b/server/named_pipe.c
index a763982..d76c242 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -74,7 +74,7 @@
     struct named_pipe   *pipe;
     struct timeout_user *flush_poll;
     struct event        *event;
-    struct list          wait_q;     /* only a single one can be queued */
+    struct async_queue  *wait_q;     /* only a single one can be queued */
     unsigned int         options;    /* pipe options */
 };
 
@@ -96,7 +96,7 @@
     unsigned int        timeout;
     unsigned int        instances;
     struct list         servers;     /* list of servers using this pipe */
-    struct list         waiters;     /* list of clients waiting to connect */
+    struct async_queue *waiters;     /* list of clients waiting to connect */
 };
 
 struct named_pipe_device
@@ -274,7 +274,7 @@
 
     assert( list_empty( &pipe->servers ) );
     assert( !pipe->instances );
-    async_terminate_queue( &pipe->waiters, STATUS_HANDLES_CLOSED );
+    if (pipe->waiters) release_object( pipe->waiters );
 }
 
 static struct fd *pipe_client_get_fd( struct object *obj )
@@ -366,7 +366,7 @@
         server->client = NULL;
     }
 
-    async_terminate_head( &server->wait_q, STATUS_HANDLES_CLOSED );
+    release_object( server->wait_q );
 
     assert( server->pipe->instances );
     server->pipe->instances--;
@@ -634,7 +634,7 @@
     server->client = NULL;
     server->flush_poll = NULL;
     server->options = options;
-    list_init( &server->wait_q );
+    server->wait_q = create_async_queue( NULL );
 
     list_add_head( &pipe->servers, &server->entry );
     grab_object( pipe );
@@ -718,8 +718,7 @@
             if (client->fd && server->fd && res != 1)
             {
                 if (server->state == ps_wait_open)
-                    async_terminate_head( &server->wait_q, STATUS_SUCCESS );
-                assert( list_empty( &server->wait_q ) );
+                    async_wake_up( server->wait_q, STATUS_SUCCESS );
                 server->state = ps_connected_server;
                 server->client = client;
                 client->server = server;
@@ -753,8 +752,8 @@
     {
         /* initialize it if it didn't already exist */
         pipe->instances = 0;
+        pipe->waiters = NULL;
         list_init( &pipe->servers );
-        list_init( &pipe->waiters );
         pipe->insize = req->insize;
         pipe->outsize = req->outsize;
         pipe->maxinstances = req->maxinstances;
@@ -805,8 +804,8 @@
     case ps_wait_connect:
         assert( !server->fd );
         server->state = ps_wait_open;
-        create_async( current, NULL, &server->wait_q, &req->async );
-        async_terminate_queue( &server->pipe->waiters, STATUS_SUCCESS );
+        create_async( current, NULL, server->wait_q, &req->async );
+        if (server->pipe->waiters) async_wake_up( server->pipe->waiters, STATUS_SUCCESS );
         set_error( STATUS_PENDING );
         break;
     case ps_connected_server:
@@ -849,9 +848,14 @@
     server = find_available_server( pipe );
     if (!server)
     {
+        if (!pipe->waiters && !(pipe->waiters = create_async_queue( NULL )))
+        {
+            release_object( pipe );
+            return;
+        }
         if (req->timeout == NMPWAIT_WAIT_FOREVER)
         {
-            if (create_async( current, NULL, &pipe->waiters, &req->async ))
+            if (create_async( current, NULL, pipe->waiters, &req->async ))
                 set_error( STATUS_PENDING );
         }
         else
@@ -859,7 +863,7 @@
             struct timeval when = current_time;
             if (req->timeout == NMPWAIT_USE_DEFAULT_WAIT) add_timeout( &when, pipe->timeout );
             else add_timeout( &when, req->timeout );
-            if (create_async( current, &when, &pipe->waiters, &req->async ))
+            if (create_async( current, &when, pipe->waiters, &req->async ))
                 set_error( STATUS_PENDING );
         }
     }