server: Make the APC callback optional in async calls.

oldstable
Alexandre Julliard 2015-05-06 17:10:31 +09:00
parent 83e3a9c9ba
commit 481517178f
1 changed files with 15 additions and 9 deletions

View File

@ -145,8 +145,6 @@ static void async_queue_destroy( struct object *obj )
/* notifies client thread of new status of its async request */
void async_terminate( struct async *async, unsigned int status )
{
apc_call_t data;
assert( status != STATUS_PENDING );
if (async->status != STATUS_PENDING)
@ -156,14 +154,22 @@ void async_terminate( struct async *async, unsigned int status )
return;
}
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.sb = async->data.iosb;
data.async_io.status = status;
thread_queue_apc( async->thread, &async->obj, &data );
async->status = status;
if (async->data.callback)
{
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.sb = async->data.iosb;
data.async_io.status = status;
thread_queue_apc( async->thread, &async->obj, &data );
}
else async_set_result( &async->obj, STATUS_SUCCESS, 0, 0, 0 );
async_reselect( async );
release_object( async ); /* so that it gets destroyed when the async is done */
}