server: Store completion in async object instead of async_queue.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
9df88c3055
commit
7f17bae74e
|
@ -51,6 +51,8 @@ struct async
|
||||||
struct iosb *iosb; /* I/O status block */
|
struct iosb *iosb; /* I/O status block */
|
||||||
obj_handle_t wait_handle; /* pre-allocated wait handle */
|
obj_handle_t wait_handle; /* pre-allocated wait handle */
|
||||||
int direct_result; /* a flag if we're passing result directly from request instead of APC */
|
int direct_result; /* a flag if we're passing result directly from request instead of APC */
|
||||||
|
struct completion *completion; /* completion associated with fd */
|
||||||
|
apc_param_t comp_key; /* completion key associated with fd */
|
||||||
};
|
};
|
||||||
|
|
||||||
static void async_dump( struct object *obj, int verbose );
|
static void async_dump( struct object *obj, int verbose );
|
||||||
|
@ -85,8 +87,6 @@ struct async_queue
|
||||||
{
|
{
|
||||||
struct object obj; /* object header */
|
struct object obj; /* object header */
|
||||||
struct fd *fd; /* file descriptor owning this queue */
|
struct fd *fd; /* file descriptor owning this queue */
|
||||||
struct completion *completion; /* completion associated with a recently closed file descriptor */
|
|
||||||
apc_param_t comp_key; /* completion key associated with a recently closed file descriptor */
|
|
||||||
struct list queue; /* queue of async objects */
|
struct list queue; /* queue of async objects */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -170,6 +170,7 @@ static void async_destroy( struct object *obj )
|
||||||
else if (async->fd) release_object( async->fd );
|
else if (async->fd) release_object( async->fd );
|
||||||
|
|
||||||
if (async->timeout) remove_timeout_user( async->timeout );
|
if (async->timeout) remove_timeout_user( async->timeout );
|
||||||
|
if (async->completion) release_object( async->completion );
|
||||||
if (async->event) release_object( async->event );
|
if (async->event) release_object( async->event );
|
||||||
if (async->iosb) release_object( async->iosb );
|
if (async->iosb) release_object( async->iosb );
|
||||||
release_object( async->thread );
|
release_object( async->thread );
|
||||||
|
@ -184,9 +185,7 @@ static void async_queue_dump( struct object *obj, int verbose )
|
||||||
|
|
||||||
static void async_queue_destroy( struct object *obj )
|
static void async_queue_destroy( struct object *obj )
|
||||||
{
|
{
|
||||||
struct async_queue *async_queue = (struct async_queue *)obj;
|
|
||||||
assert( obj->ops == &async_queue_ops );
|
assert( obj->ops == &async_queue_ops );
|
||||||
if (async_queue->completion) release_object( async_queue->completion );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* notifies client thread of new status of its async request */
|
/* notifies client thread of new status of its async request */
|
||||||
|
@ -241,7 +240,6 @@ struct async_queue *create_async_queue( struct fd *fd )
|
||||||
if (queue)
|
if (queue)
|
||||||
{
|
{
|
||||||
queue->fd = fd;
|
queue->fd = fd;
|
||||||
queue->completion = NULL;
|
|
||||||
list_init( &queue->queue );
|
list_init( &queue->queue );
|
||||||
}
|
}
|
||||||
return queue;
|
return queue;
|
||||||
|
@ -253,8 +251,11 @@ void free_async_queue( struct async_queue *queue )
|
||||||
struct async *async;
|
struct async *async;
|
||||||
|
|
||||||
if (!queue) return;
|
if (!queue) return;
|
||||||
if (queue->fd) queue->completion = fd_get_completion( queue->fd, &queue->comp_key );
|
LIST_FOR_EACH_ENTRY( async, &queue->queue, struct async, queue_entry )
|
||||||
LIST_FOR_EACH_ENTRY( async, &queue->queue, struct async, queue_entry ) async->fd = NULL;
|
{
|
||||||
|
async->completion = fd_get_completion( async->fd, &async->comp_key );
|
||||||
|
async->fd = NULL;
|
||||||
|
}
|
||||||
queue->fd = NULL;
|
queue->fd = NULL;
|
||||||
async_wake_up( queue, STATUS_HANDLES_CLOSED );
|
async_wake_up( queue, STATUS_HANDLES_CLOSED );
|
||||||
release_object( queue );
|
release_object( queue );
|
||||||
|
@ -297,6 +298,7 @@ struct async *create_async( struct fd *fd, struct thread *thread, const async_da
|
||||||
async->signaled = 0;
|
async->signaled = 0;
|
||||||
async->wait_handle = 0;
|
async->wait_handle = 0;
|
||||||
async->direct_result = 0;
|
async->direct_result = 0;
|
||||||
|
async->completion = NULL;
|
||||||
|
|
||||||
if (iosb) async->iosb = (struct iosb *)grab_object( iosb );
|
if (iosb) async->iosb = (struct iosb *)grab_object( iosb );
|
||||||
else async->iosb = NULL;
|
else async->iosb = NULL;
|
||||||
|
@ -386,19 +388,8 @@ void async_set_timeout( struct async *async, timeout_t timeout, unsigned int sta
|
||||||
static void add_async_completion( struct async *async, apc_param_t cvalue, unsigned int status,
|
static void add_async_completion( struct async *async, apc_param_t cvalue, unsigned int status,
|
||||||
apc_param_t information )
|
apc_param_t information )
|
||||||
{
|
{
|
||||||
if (async->fd)
|
if (async->fd && !async->completion) async->completion = fd_get_completion( async->fd, &async->comp_key );
|
||||||
{
|
if (async->completion) add_completion( async->completion, async->comp_key, cvalue, status, information );
|
||||||
apc_param_t ckey;
|
|
||||||
struct completion *completion = fd_get_completion( async->fd, &ckey );
|
|
||||||
|
|
||||||
if (completion)
|
|
||||||
{
|
|
||||||
add_completion( completion, ckey, cvalue, status, information );
|
|
||||||
release_object( completion );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (async->queue && async->queue->completion)
|
|
||||||
add_completion( async->queue->completion, async->queue->comp_key, cvalue, status, information );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* store the result of the client-side async callback */
|
/* store the result of the client-side async callback */
|
||||||
|
|
Loading…
Reference in New Issue