Alexandre Julliard : server: Hold a pointer to the queue from the async operations.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Apr 4 12:32:25 CDT 2007


Module: wine
Branch: master
Commit: b2cba95abd02950577eafa313b781eb8e042490e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b2cba95abd02950577eafa313b781eb8e042490e

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Apr  3 19:36:07 2007 +0200

server: Hold a pointer to the queue from the async operations.

---

 server/async.c      |   26 +++++++++++++++-----------
 server/fd.c         |    6 +++---
 server/file.h       |    1 +
 server/named_pipe.c |    4 ++--
 server/sock.c       |    4 ++--
 5 files changed, 23 insertions(+), 18 deletions(-)

diff --git a/server/async.c b/server/async.c
index c58ef5f..027dd25 100644
--- a/server/async.c
+++ b/server/async.c
@@ -36,7 +36,8 @@ struct async
 {
     struct object        obj;             /* object header */
     struct thread       *thread;          /* owning thread */
-    struct list          queue_entry;     /* entry in file descriptor queue */
+    struct list          queue_entry;     /* entry in async queue list */
+    struct async_queue  *queue;           /* queue containing this async */
     struct timeout_user *timeout;
     unsigned int         timeout_status;  /* status to report upon timeout */
     struct event        *event;
@@ -72,7 +73,6 @@ struct async_queue
 };
 
 static void async_queue_dump( struct object *obj, int verbose );
-static void async_queue_destroy( struct object *obj );
 
 static const struct object_ops async_queue_ops =
 {
@@ -88,7 +88,7 @@ static const struct object_ops async_queue_ops =
     no_lookup_name,                  /* lookup_name */
     no_open_file,                    /* open_file */
     no_close_handle,                 /* close_handle */
-    async_queue_destroy              /* destroy */
+    no_destroy                       /* destroy */
 };
 
 
@@ -106,6 +106,8 @@ static void async_destroy( struct object *obj )
 
     if (async->timeout) remove_timeout_user( async->timeout );
     if (async->event) release_object( async->event );
+    release_object( async->queue );
+    async->queue = NULL;
     release_object( async->thread );
 }
 
@@ -116,14 +118,6 @@ static void async_queue_dump( struct object *obj, int verbose )
     fprintf( stderr, "Async queue fd=%p\n", async_queue->fd );
 }
 
-static void async_queue_destroy( struct object *obj )
-{
-    struct async_queue *async_queue = (struct async_queue *)obj;
-    assert( obj->ops == &async_queue_ops );
-
-    async_wake_up( async_queue, STATUS_HANDLES_CLOSED );
-}
-
 /* notifies client thread of new status of its async request */
 /* destroys the server side of it */
 static void async_terminate( struct async *async, unsigned int status )
@@ -166,6 +160,15 @@ struct async_queue *create_async_queue( struct fd *fd )
     return queue;
 }
 
+/* free an async queue, cancelling all async operations */
+void free_async_queue( struct async_queue *queue )
+{
+    if (!queue) return;
+    queue->fd = NULL;
+    async_wake_up( queue, STATUS_HANDLES_CLOSED );
+    release_object( queue );
+}
+
 /* create an async on a given queue of a fd */
 struct async *create_async( struct thread *thread, struct async_queue *queue, const async_data_t *data )
 {
@@ -185,6 +188,7 @@ struct async *create_async( struct thread *thread, struct async_queue *queue, co
     async->event = event;
     async->data = *data;
     async->timeout = NULL;
+    async->queue = (struct async_queue *)grab_object( queue );
 
     list_add_tail( &queue->queue, &async->queue_entry );
     grab_object( async );
diff --git a/server/fd.c b/server/fd.c
index 279f72a..25917ae 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -1286,9 +1286,9 @@ static void fd_destroy( struct object *obj )
 {
     struct fd *fd = (struct fd *)obj;
 
-    if (fd->read_q) release_object( fd->read_q );
-    if (fd->write_q) release_object( fd->write_q );
-    if (fd->wait_q) release_object( fd->wait_q );
+    free_async_queue( fd->read_q );
+    free_async_queue( fd->write_q );
+    free_async_queue( fd->wait_q );
 
     remove_fd_locks( fd );
     list_remove( &fd->inode_entry );
diff --git a/server/file.h b/server/file.h
index a46a24f..3514022 100644
--- a/server/file.h
+++ b/server/file.h
@@ -124,6 +124,7 @@ extern struct object *create_serial( struct fd *fd, unsigned int options );
 
 /* async I/O functions */
 extern struct async_queue *create_async_queue( struct fd *fd );
+extern void free_async_queue( struct async_queue *queue );
 extern struct async *create_async( struct thread *thread, struct async_queue *queue,
                                    const async_data_t *data );
 extern void async_set_timeout( struct async *async, const struct timeval *timeout,
diff --git a/server/named_pipe.c b/server/named_pipe.c
index 9136041..0a4ab96 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -274,7 +274,7 @@ static void named_pipe_destroy( struct object *obj)
 
     assert( list_empty( &pipe->servers ) );
     assert( !pipe->instances );
-    if (pipe->waiters) release_object( pipe->waiters );
+    free_async_queue( pipe->waiters );
 }
 
 static struct fd *pipe_client_get_fd( struct object *obj )
@@ -366,7 +366,7 @@ static void pipe_server_destroy( struct object *obj)
         server->client = NULL;
     }
 
-    release_object( server->wait_q );
+    free_async_queue( server->wait_q );
 
     assert( server->pipe->instances );
     server->pipe->instances--;
diff --git a/server/sock.c b/server/sock.c
index 1e70f2e..90103f9 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -581,8 +581,8 @@ static void sock_destroy( struct object *obj )
     if ( sock->deferred )
         release_object( sock->deferred );
 
-    if (sock->read_q) release_object( sock->read_q );
-    if (sock->write_q) release_object( sock->write_q );
+    free_async_queue( sock->read_q );
+    free_async_queue( sock->write_q );
     if (sock->event) release_object( sock->event );
     if (sock->fd)
     {




More information about the wine-cvs mailing list