Jacek Caban : server: Introduce create_server_async and use it in read request handler.

Alexandre Julliard julliard at winehq.org
Tue Jun 20 15:34:55 CDT 2017


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Jun 13 16:46:41 2017 +0200

server: Introduce create_server_async and use it in read request handler.

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

---

 server/async.c | 14 ++++++++++++++
 server/fd.c    | 14 ++++----------
 server/file.h  |  1 +
 3 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/server/async.c b/server/async.c
index f9d8af3..d1cea9a 100644
--- a/server/async.c
+++ b/server/async.c
@@ -272,6 +272,20 @@ struct async *create_async( struct thread *thread, const async_data_t *data, str
     return async;
 }
 
+/* create an async associated with iosb for async-based requests */
+struct async *create_request_async( struct thread *thread, const async_data_t *data )
+{
+    struct async *async;
+    struct iosb *iosb;
+
+    if (!(iosb = create_iosb( get_req_data(), get_req_data_size(), get_reply_max_size() )))
+        return NULL;
+
+    async = create_async( current, data, iosb );
+    release_object( iosb );
+    return async;
+}
+
 /* set the timeout of an async operation */
 void async_set_timeout( struct async *async, timeout_t timeout, unsigned int status )
 {
diff --git a/server/fd.c b/server/fd.c
index 3c8f1bd..f05556a 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -2446,20 +2446,14 @@ DECL_HANDLER(read)
 {
     struct fd *fd = get_handle_fd_obj( current->process, req->async.handle, FILE_READ_DATA );
     struct async *async;
-    struct iosb *iosb;
 
     if (!fd) return;
 
-    if ((iosb = create_iosb( NULL, 0, get_reply_max_size() )))
+    if ((async = create_request_async( current, &req->async )))
     {
-        async = create_async( current, &req->async, iosb );
-        if (async)
-        {
-            reply->wait    = fd->fd_ops->read( fd, async, req->pos );
-            reply->options = fd->options;
-            release_object( async );
-        }
-        release_object( iosb );
+        reply->wait    = fd->fd_ops->read( fd, async, req->pos );
+        reply->options = fd->options;
+        release_object( async );
     }
     release_object( fd );
 }
diff --git a/server/file.h b/server/file.h
index 5ea8f0f..30db87e 100644
--- a/server/file.h
+++ b/server/file.h
@@ -176,6 +176,7 @@ extern struct object *create_serial( struct fd *fd );
 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, const async_data_t *data, struct iosb *iosb );
+extern struct async *create_request_async( struct thread *thread, const async_data_t *data );
 extern void queue_async( struct async_queue *queue, struct async *async );
 extern void async_set_timeout( struct async *async, timeout_t timeout, unsigned int status );
 extern void async_set_result( struct object *obj, unsigned int status, apc_param_t total );




More information about the wine-cvs mailing list