Only really an optimization (plus it makes the code a little conceptually simpler).
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/ntdll/unix/file.c | 1 - dlls/ntdll/unix/server.c | 2 +- dlls/ntdll/unix/socket.c | 15 ++++----------- server/async.c | 9 ++++----- server/protocol.def | 2 +- server/trace.c | 2 +- 6 files changed, 11 insertions(+), 20 deletions(-)
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c index 712f94ec43f..5da9ca560f6 100644 --- a/dlls/ntdll/unix/file.c +++ b/dlls/ntdll/unix/file.c @@ -4690,7 +4690,6 @@ static NTSTATUS irp_completion( void *user, ULONG_PTR *info, NTSTATUS status ) req->user_arg = wine_server_client_ptr( async ); wine_server_set_reply( req, async->buffer, async->size ); status = virtual_locked_server_call( req ); - *info = reply->size; } SERVER_END_REQ; } diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c index 986eb6c3250..d0cfd4cd46c 100644 --- a/dlls/ntdll/unix/server.c +++ b/dlls/ntdll/unix/server.c @@ -378,7 +378,7 @@ static void invoke_system_apc( const apc_call_t *call, apc_result_t *result, BOO case APC_ASYNC_IO: { struct async_fileio *user = wine_server_get_ptr( call->async_io.user ); - ULONG_PTR info = 0; + ULONG_PTR info = call->async_io.result;
result->type = call->type; result->async_io.status = user->callback( user, &info, call->async_io.status ); diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c index 8469def786a..db58d2e5b12 100644 --- a/dlls/ntdll/unix/socket.c +++ b/dlls/ntdll/unix/socket.c @@ -565,7 +565,6 @@ static NTSTATUS try_recv( int fd, struct async_recv_ioctl *async, ULONG_PTR *siz static NTSTATUS async_recv_proc( void *user, ULONG_PTR *info, NTSTATUS status ) { struct async_recv_ioctl *async = user; - ULONG_PTR information = 0; int fd, needs_close;
TRACE( "%#x\n", status ); @@ -575,19 +574,15 @@ static NTSTATUS async_recv_proc( void *user, ULONG_PTR *info, NTSTATUS status ) if ((status = server_get_unix_fd( async->io.handle, 0, &fd, &needs_close, NULL, NULL ))) return status;
- status = try_recv( fd, async, &information ); - TRACE( "got status %#x, %#lx bytes read\n", status, information ); + status = try_recv( fd, async, info ); + TRACE( "got status %#x, %#lx bytes read\n", status, *info );
if (status == STATUS_DEVICE_NOT_READY) status = STATUS_PENDING;
if (needs_close) close( fd ); } - if (status != STATUS_PENDING) - { - *info = information; - release_fileio( &async->io ); - } + if (status != STATUS_PENDING) release_fileio( &async->io ); return status; }
@@ -704,7 +699,6 @@ static ULONG_PTR fill_poll_output( struct async_poll_ioctl *async, NTSTATUS stat static NTSTATUS async_poll_proc( void *user, ULONG_PTR *info, NTSTATUS status ) { struct async_poll_ioctl *async = user; - ULONG_PTR information = 0;
if (status == STATUS_ALERTED) { @@ -716,12 +710,11 @@ static NTSTATUS async_poll_proc( void *user, ULONG_PTR *info, NTSTATUS status ) } SERVER_END_REQ;
- information = fill_poll_output( async, status ); + *info = fill_poll_output( async, status ); }
if (status != STATUS_PENDING) { - *info = information; free( async->input ); release_fileio( &async->io ); } diff --git a/server/async.c b/server/async.c index 7cffd24a18b..bdc7620e9a1 100644 --- a/server/async.c +++ b/server/async.c @@ -185,11 +185,11 @@ void async_terminate( struct async *async, unsigned int status ) data.type = APC_ASYNC_IO; data.async_io.user = async->data.user; data.async_io.sb = async->data.iosb; + data.async_io.result = iosb ? iosb->result : 0;
- /* if the result is nonzero or there is output data, the client needs to - * make an extra request to retrieve them; use STATUS_ALERTED to signal - * this case */ - if (iosb && (iosb->result || iosb->out_data)) + /* if there is output data, the client needs to make an extra request + * to retrieve it; use STATUS_ALERTED to signal this case */ + if (iosb && iosb->out_data) data.async_io.status = STATUS_ALERTED; else data.async_io.status = status; @@ -719,6 +719,5 @@ DECL_HANDLER(get_async_result) iosb->out_data = NULL; } } - reply->size = iosb->result; set_error( iosb->status ); } diff --git a/server/protocol.def b/server/protocol.def index 02c1f269be7..cc1887dae2d 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -508,6 +508,7 @@ typedef union unsigned int status; /* I/O status */ client_ptr_t user; /* user pointer */ client_ptr_t sb; /* status block */ + data_size_t result; /* result size */ } async_io; struct { @@ -2156,7 +2157,6 @@ enum message_type @REQ(get_async_result) client_ptr_t user_arg; /* user arg used to identify async */ @REPLY - data_size_t size; /* result size (input or output depending on the operation) */ VARARG(out_data,bytes); /* iosb output data */ @END
diff --git a/server/trace.c b/server/trace.c index da8c74cea2b..b11e51e6d81 100644 --- a/server/trace.c +++ b/server/trace.c @@ -181,7 +181,7 @@ static void dump_apc_call( const char *prefix, const apc_call_t *call ) case APC_ASYNC_IO: 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) ); + fprintf( stderr, ",status=%s,result=%u", get_status_name(call->async_io.status), call->async_io.result ); break; case APC_VIRTUAL_ALLOC: dump_uint64( "APC_VIRTUAL_ALLOC,addr==", &call->virtual_alloc.addr );