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, ¤t->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