Alexandre Julliard : server:
Notify the async object when the APC call completed.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Mar 21 17:02:45 CDT 2007
Module: wine
Branch: master
Commit: 8adce7765a55e356e6dddd672f312ef9c6acdd5c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8adce7765a55e356e6dddd672f312ef9c6acdd5c
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Mar 21 14:28:23 2007 +0100
server: Notify the async object when the APC call completed.
---
server/async.c | 17 +++++++++++++++++
server/file.h | 1 +
server/thread.c | 4 ++++
3 files changed, 22 insertions(+), 0 deletions(-)
diff --git a/server/async.c b/server/async.c
index bc5893a..2d8018a 100644
--- a/server/async.c
+++ b/server/async.c
@@ -136,6 +136,23 @@ struct async *create_async( struct thread *thread, const struct timeval *timeout
return async;
}
+/* store the result of the client-side async callback */
+void async_set_result( struct object *obj, unsigned int status )
+{
+ struct async *async = (struct async *)obj;
+
+ if (obj->ops != &async_ops) return; /* in case the client messed up the APC results */
+
+ if (status == STATUS_PENDING)
+ {
+ /* FIXME: restart the async operation */
+ }
+ else
+ {
+ if (async->event) set_event( async->event );
+ }
+}
+
/* terminate the async operation at the head of the queue */
void async_terminate_head( struct list *queue, unsigned int status )
{
diff --git a/server/file.h b/server/file.h
index ae98cf1..de5bf3a 100644
--- a/server/file.h
+++ b/server/file.h
@@ -124,6 +124,7 @@ extern struct object *create_serial( struct fd *fd, unsigned int options );
/* async I/O functions */
extern struct async *create_async( struct thread *thread, const struct timeval *timeout,
struct list *queue, const async_data_t *data );
+extern void async_set_result( struct object *obj, unsigned int status );
extern void async_terminate_head( struct list *queue, unsigned int status );
extern void async_terminate_queue( struct list *queue, unsigned int status );
diff --git a/server/thread.c b/server/thread.c
index 6323110..dfa7411 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -1246,6 +1246,10 @@ DECL_HANDLER(get_apc)
apc->result.create_thread.handle = handle;
clear_error(); /* ignore errors from the above calls */
}
+ else if (apc->result.type == APC_ASYNC_IO)
+ {
+ if (apc->owner) async_set_result( apc->owner, apc->result.async_io.status );
+ }
wake_up( &apc->obj, 0 );
close_handle( current->process, req->prev );
release_object( apc );
More information about the wine-cvs
mailing list