Jacek Caban : server: Pass APC in async_data_t.

Alexandre Julliard julliard at winehq.org
Tue Apr 11 15:31:04 CDT 2017


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Apr 10 13:21:31 2017 +0200

server: Pass APC in async_data_t.

Also don't pass callback pointer that's not used anymore.

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

---

 dlls/ntdll/file.c              | 12 ++++++------
 dlls/ws2_32/socket.c           | 14 +++++++-------
 include/wine/server_protocol.h |  9 ++++-----
 server/async.c                 | 11 +++++------
 server/protocol.def            |  7 +++----
 server/trace.c                 | 11 ++++++-----
 6 files changed, 31 insertions(+), 33 deletions(-)

diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 6273254..cf4edb7 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -422,12 +422,12 @@ static async_data_t server_async( HANDLE handle, struct async_fileio *user, HAND
                                   PIO_APC_ROUTINE apc, void *apc_context, IO_STATUS_BLOCK *io )
 {
     async_data_t async;
-    async.handle   = wine_server_obj_handle( handle );
-    async.callback = wine_server_client_ptr( user ? user->callback : 0 );
-    async.arg      = wine_server_client_ptr( user );
-    async.iosb     = wine_server_client_ptr( io );
-    async.event    = wine_server_obj_handle( event );
-    async.cvalue   = wine_server_client_ptr( apc ? 0 : apc_context );
+    async.handle      = wine_server_obj_handle( handle );
+    async.user        = wine_server_client_ptr( user );
+    async.iosb        = wine_server_client_ptr( io );
+    async.event       = wine_server_obj_handle( event );
+    async.apc         = wine_server_client_ptr( apc );
+    async.apc_context = wine_server_client_ptr( apc_context );
     return async;
 }
 
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index efeb0f3..5bf0482 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -572,13 +572,13 @@ static NTSTATUS register_async( int type, HANDLE handle, struct ws2_async_io *as
 
     SERVER_START_REQ( register_async )
     {
-        req->type           = type;
-        req->async.handle   = wine_server_obj_handle( handle );
-        req->async.callback = wine_server_client_ptr( async->callback );
-        req->async.arg      = wine_server_client_ptr( async );
-        req->async.iosb     = wine_server_client_ptr( io );
-        req->async.event    = wine_server_obj_handle( event );
-        req->async.cvalue   = wine_server_client_ptr( apc ? 0 : apc_context );
+        req->type              = type;
+        req->async.handle      = wine_server_obj_handle( handle );
+        req->async.user        = wine_server_client_ptr( async );
+        req->async.iosb        = wine_server_client_ptr( io );
+        req->async.event       = wine_server_obj_handle( event );
+        req->async.apc         = wine_server_client_ptr( apc );
+        req->async.apc_context = wine_server_client_ptr( apc_context );
         status = wine_server_call( req );
     }
     SERVER_END_REQ;
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index ee9fdd1..f1ae41cd 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -252,10 +252,10 @@ typedef struct
 {
     obj_handle_t    handle;
     obj_handle_t    event;
-    client_ptr_t    callback;
     client_ptr_t    iosb;
-    client_ptr_t    arg;
-    apc_param_t     cvalue;
+    client_ptr_t    user;
+    client_ptr_t    apc;
+    apc_param_t     apc_context;
 } async_data_t;
 
 
@@ -463,7 +463,6 @@ typedef union
     {
         enum apc_type    type;
         unsigned int     status;
-        client_ptr_t     func;
         client_ptr_t     user;
         client_ptr_t     sb;
     } async_io;
@@ -6412,6 +6411,6 @@ union generic_reply
     struct terminate_job_reply terminate_job_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 524
+#define SERVER_PROTOCOL_VERSION 525
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/async.c b/server/async.c
index e113681..ba80721 100644
--- a/server/async.c
+++ b/server/async.c
@@ -180,14 +180,13 @@ void async_terminate( struct async *async, unsigned int status )
     async->status = status;
     if (async->iosb && async->iosb->status == STATUS_PENDING) async->iosb->status = status;
 
-    if (async->data.callback)
+    if (async->data.user)
     {
         apc_call_t data;
 
         memset( &data, 0, sizeof(data) );
         data.type            = APC_ASYNC_IO;
-        data.async_io.func   = async->data.callback;
-        data.async_io.user   = async->data.arg;
+        data.async_io.user   = async->data.user;
         data.async_io.sb     = async->data.iosb;
         data.async_io.status = status;
         thread_queue_apc( async->thread, &async->obj, &data );
@@ -328,8 +327,8 @@ void async_set_result( struct object *obj, unsigned int status, apc_param_t tota
         async->status = status;
         if (status == STATUS_MORE_PROCESSING_REQUIRED) return;  /* don't report the completion */
 
-        if (async->queue && async->data.cvalue)
-            add_async_completion( async->queue, async->data.cvalue, status, total );
+        if (async->queue && !async->data.apc && async->data.apc_context)
+            add_async_completion( async->queue, async->data.apc_context, status, total );
         if (apc)
         {
             apc_call_t data;
@@ -504,7 +503,7 @@ DECL_HANDLER(get_async_result)
     struct async *async;
 
     LIST_FOR_EACH_ENTRY( async, &current->process->asyncs, struct async, process_entry )
-        if (async->data.arg == req->user_arg)
+        if (async->data.user == req->user_arg)
         {
             iosb = async->iosb;
             break;
diff --git a/server/protocol.def b/server/protocol.def
index 60865a6..204df9c 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -268,10 +268,10 @@ typedef struct
 {
     obj_handle_t    handle;        /* object to perform I/O on */
     obj_handle_t    event;         /* event to signal when done */
-    client_ptr_t    callback;      /* client-side callback to call upon end of async */
     client_ptr_t    iosb;          /* I/O status block in client addr space */
-    client_ptr_t    arg;           /* opaque user data to pass to callback */
-    apc_param_t     cvalue;        /* completion value to use for completion events */
+    client_ptr_t    user;          /* opaque user data containing callback pointer and async-specific data */
+    client_ptr_t    apc;           /* user APC to call */
+    apc_param_t     apc_context;   /* user APC context or completion value */
 } async_data_t;
 
 /* structures for extra message data */
@@ -479,7 +479,6 @@ typedef union
     {
         enum apc_type    type;     /* APC_ASYNC_IO */
         unsigned int     status;   /* I/O status */
-        client_ptr_t     func;     /* unsigned int (*func)(void*, void*, unsigned int, void**, void**); */
         client_ptr_t     user;     /* user pointer */
         client_ptr_t     sb;       /* status block */
     } async_io;
diff --git a/server/trace.c b/server/trace.c
index e0ce45a..febd2f7 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -158,8 +158,7 @@ static void dump_apc_call( const char *prefix, const apc_call_t *call )
         dump_uint64( ",arg=", &call->timer.arg );
         break;
     case APC_ASYNC_IO:
-        dump_uint64( "APC_ASYNC_IO,func=", &call->async_io.func );
-        dump_uint64( ",user=", &call->async_io.user );
+        dump_uint64( "APC_ASYNC_IO,user=", &call->async_io.user );
         dump_uint64( ",sb=", &call->async_io.sb );
         fprintf( stderr, ",status=%s", get_status_name(call->async_io.status) );
         break;
@@ -305,10 +304,10 @@ static void dump_apc_result( const char *prefix, const apc_result_t *result )
 static void dump_async_data( const char *prefix, const async_data_t *data )
 {
     fprintf( stderr, "%s{handle=%04x,event=%04x", prefix, data->handle, data->event );
-    dump_uint64( ",callback=", &data->callback );
     dump_uint64( ",iosb=", &data->iosb );
-    dump_uint64( ",arg=", &data->arg );
-    dump_uint64( ",cvalue=", &data->cvalue );
+    dump_uint64( ",user=", &data->user );
+    dump_uint64( ",apc=", &data->apc );
+    dump_uint64( ",apc_context=", &data->apc_context );
     fputc( '}', stderr );
 }
 
@@ -5367,6 +5366,7 @@ static const struct
     { "HANDLE_NOT_CLOSABLE",         STATUS_HANDLE_NOT_CLOSABLE },
     { "HOST_UNREACHABLE",            STATUS_HOST_UNREACHABLE },
     { "ILLEGAL_FUNCTION",            STATUS_ILLEGAL_FUNCTION },
+    { "INFO_LENGTH_MISMATCH",        STATUS_INFO_LENGTH_MISMATCH },
     { "INSTANCE_NOT_AVAILABLE",      STATUS_INSTANCE_NOT_AVAILABLE },
     { "INSUFFICIENT_RESOURCES",      STATUS_INSUFFICIENT_RESOURCES },
     { "INVALID_CID",                 STATUS_INVALID_CID },
@@ -5413,6 +5413,7 @@ static const struct
     { "OBJECT_PATH_SYNTAX_BAD",      STATUS_OBJECT_PATH_SYNTAX_BAD },
     { "OBJECT_TYPE_MISMATCH",        STATUS_OBJECT_TYPE_MISMATCH },
     { "PENDING",                     STATUS_PENDING },
+    { "PIPE_BROKEN",                 STATUS_PIPE_BROKEN },
     { "PIPE_CONNECTED",              STATUS_PIPE_CONNECTED },
     { "PIPE_DISCONNECTED",           STATUS_PIPE_DISCONNECTED },
     { "PIPE_LISTENING",              STATUS_PIPE_LISTENING },




More information about the wine-cvs mailing list