Jacek Caban : server: Store completion in async object instead of async_queue.

Alexandre Julliard julliard at winehq.org
Wed Jul 5 15:41:01 CDT 2017


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Jul  4 15:26:05 2017 +0200

server: Store completion in async object instead of async_queue.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 server/async.c | 31 +++++++++++--------------------
 1 file changed, 11 insertions(+), 20 deletions(-)

diff --git a/server/async.c b/server/async.c
index ed85899..e612669 100644
--- a/server/async.c
+++ b/server/async.c
@@ -51,6 +51,8 @@ struct async
     struct iosb         *iosb;            /* I/O status block */
     obj_handle_t         wait_handle;     /* pre-allocated wait handle */
     int                  direct_result;   /* a flag if we're passing result directly from request instead of APC  */
+    struct completion   *completion;      /* completion associated with fd */
+    apc_param_t          comp_key;        /* completion key associated with fd */
 };
 
 static void async_dump( struct object *obj, int verbose );
@@ -85,8 +87,6 @@ struct async_queue
 {
     struct object        obj;             /* object header */
     struct fd           *fd;              /* file descriptor owning this queue */
-    struct completion   *completion;      /* completion associated with a recently closed file descriptor */
-    apc_param_t          comp_key;        /* completion key associated with a recently closed file descriptor */
     struct list          queue;           /* queue of async objects */
 };
 
@@ -170,6 +170,7 @@ static void async_destroy( struct object *obj )
     else if (async->fd) release_object( async->fd );
 
     if (async->timeout) remove_timeout_user( async->timeout );
+    if (async->completion) release_object( async->completion );
     if (async->event) release_object( async->event );
     if (async->iosb) release_object( async->iosb );
     release_object( async->thread );
@@ -184,9 +185,7 @@ static void async_queue_dump( struct object *obj, int verbose )
 
 static void async_queue_destroy( struct object *obj )
 {
-    struct async_queue *async_queue = (struct async_queue *)obj;
     assert( obj->ops == &async_queue_ops );
-    if (async_queue->completion) release_object( async_queue->completion );
 }
 
 /* notifies client thread of new status of its async request */
@@ -241,7 +240,6 @@ struct async_queue *create_async_queue( struct fd *fd )
     if (queue)
     {
         queue->fd = fd;
-        queue->completion = NULL;
         list_init( &queue->queue );
     }
     return queue;
@@ -253,8 +251,11 @@ void free_async_queue( struct async_queue *queue )
     struct async *async;
 
     if (!queue) return;
-    if (queue->fd) queue->completion = fd_get_completion( queue->fd, &queue->comp_key );
-    LIST_FOR_EACH_ENTRY( async, &queue->queue, struct async, queue_entry ) async->fd = NULL;
+    LIST_FOR_EACH_ENTRY( async, &queue->queue, struct async, queue_entry )
+    {
+        async->completion = fd_get_completion( async->fd, &async->comp_key );
+        async->fd = NULL;
+    }
     queue->fd = NULL;
     async_wake_up( queue, STATUS_HANDLES_CLOSED );
     release_object( queue );
@@ -297,6 +298,7 @@ struct async *create_async( struct fd *fd, struct thread *thread, const async_da
     async->signaled      = 0;
     async->wait_handle   = 0;
     async->direct_result = 0;
+    async->completion    = NULL;
 
     if (iosb) async->iosb = (struct iosb *)grab_object( iosb );
     else async->iosb = NULL;
@@ -386,19 +388,8 @@ void async_set_timeout( struct async *async, timeout_t timeout, unsigned int sta
 static void add_async_completion( struct async *async, apc_param_t cvalue, unsigned int status,
                                   apc_param_t information )
 {
-    if (async->fd)
-    {
-        apc_param_t ckey;
-        struct completion *completion = fd_get_completion( async->fd, &ckey );
-
-        if (completion)
-        {
-            add_completion( completion, ckey, cvalue, status, information );
-            release_object( completion );
-        }
-    }
-    else if (async->queue && async->queue->completion)
-        add_completion( async->queue->completion, async->queue->comp_key, cvalue, status, information );
+    if (async->fd && !async->completion) async->completion = fd_get_completion( async->fd, &async->comp_key );
+    if (async->completion) add_completion( async->completion, async->comp_key, cvalue, status, information );
 }
 
 /* store the result of the client-side async callback */




More information about the wine-cvs mailing list