From fa4679fea6c5a6227d5d40e410d93af3d01d984c Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 21 Mar 2007 14:27:52 +0100 Subject: [PATCH] server: Add support for storing an event to signal upon async I/O completion. --- include/wine/server_protocol.h | 3 ++- server/async.c | 16 ++++++++++++++-- server/protocol.def | 1 + server/trace.c | 3 ++- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index b97e39a9ebe..68cc112c642 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -162,6 +162,7 @@ typedef struct void *callback; void *iosb; void *arg; + obj_handle_t event; } async_data_t; @@ -4699,6 +4700,6 @@ union generic_reply struct allocate_locally_unique_id_reply allocate_locally_unique_id_reply; }; -#define SERVER_PROTOCOL_VERSION 283 +#define SERVER_PROTOCOL_VERSION 284 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/server/async.c b/server/async.c index b88f8f50343..bc5893af3fe 100644 --- a/server/async.c +++ b/server/async.c @@ -38,6 +38,7 @@ struct async struct thread *thread; /* owning thread */ struct list queue_entry; /* entry in file descriptor queue */ struct timeout_user *timeout; + struct event *event; async_data_t data; /* data for async I/O call */ }; @@ -73,6 +74,7 @@ static void async_destroy( struct object *obj ) assert( obj->ops == &async_ops ); if (async->timeout) remove_timeout_user( async->timeout ); + if (async->event) release_object( async->event ); release_object( async->thread ); } @@ -109,11 +111,20 @@ static void async_timeout( void *private ) struct async *create_async( struct thread *thread, const struct timeval *timeout, struct list *queue, const async_data_t *data ) { - struct async *async = alloc_object( &async_ops ); + struct event *event = NULL; + struct async *async; - if (!async) return NULL; + if (data->event && !(event = get_event_obj( thread->process, data->event, EVENT_MODIFY_STATE ))) + return NULL; + + if (!(async = alloc_object( &async_ops ))) + { + if (event) release_object( event ); + return NULL; + } async->thread = (struct thread *)grab_object( thread ); + async->event = event; async->data = *data; list_add_tail( queue, &async->queue_entry ); @@ -121,6 +132,7 @@ struct async *create_async( struct thread *thread, const struct timeval *timeout if (timeout) async->timeout = add_timeout_user( timeout, async_timeout, async ); else async->timeout = NULL; + if (event) reset_event( event ); return async; } diff --git a/server/protocol.def b/server/protocol.def index 145fbebadbb..3d0618a708f 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -178,6 +178,7 @@ typedef struct void *callback; /* client-side callback to call upon end of async */ void *iosb; /* I/O status block in client addr space */ void *arg; /* opaque user data to pass to callback */ + obj_handle_t event; /* event to signal when done */ } async_data_t; /* structures for extra message data */ diff --git a/server/trace.c b/server/trace.c index a840c1301ea..d04c4c5244e 100644 --- a/server/trace.c +++ b/server/trace.c @@ -245,7 +245,8 @@ static void dump_apc_result( const apc_result_t *result ) static void dump_async_data( const async_data_t *data ) { - fprintf( stderr, "{callback=%p,iosb=%p,arg=%p}", data->callback, data->iosb, data->arg ); + fprintf( stderr, "{callback=%p,iosb=%p,arg=%p,event=%p}", + data->callback, data->iosb, data->arg, data->event ); } static void dump_luid( const luid_t *luid )