From 2082a97d45f74f31876c9b65ecebf3107b25cc69 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 21 Mar 2007 14:50:15 +0100 Subject: [PATCH] server: Use a standard async I/O event to signal directory changes. --- dlls/ntdll/directory.c | 4 +--- include/wine/server_protocol.h | 3 +-- server/change.c | 26 ++++++-------------------- server/protocol.def | 1 - server/trace.c | 1 - 5 files changed, 8 insertions(+), 27 deletions(-) diff --git a/dlls/ntdll/directory.c b/dlls/ntdll/directory.c index 410f35cc78..f03a7b4ba8 100644 --- a/dlls/ntdll/directory.c +++ b/dlls/ntdll/directory.c @@ -2148,7 +2148,6 @@ done: struct read_changes_info { HANDLE FileHandle; - HANDLE Event; PIO_APC_ROUTINE ApcRoutine; PVOID ApcContext; PVOID Buffer; @@ -2259,7 +2258,6 @@ NtNotifyChangeDirectoryFile( HANDLE FileHandle, HANDLE Event, return STATUS_NO_MEMORY; info->FileHandle = FileHandle; - info->Event = Event; info->Buffer = Buffer; info->BufferSize = BufferSize; info->ApcRoutine = ApcRoutine; @@ -2268,13 +2266,13 @@ NtNotifyChangeDirectoryFile( HANDLE FileHandle, HANDLE Event, SERVER_START_REQ( read_directory_changes ) { req->handle = FileHandle; - req->event = Event; req->filter = CompletionFilter; req->want_data = (Buffer != NULL); req->subtree = WatchTree; req->async.callback = read_changes_apc; req->async.iosb = IoStatusBlock; req->async.arg = info; + req->async.event = Event; status = wine_server_call( req ); } SERVER_END_REQ; diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 68cc112c64..726d833dd4 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -1655,7 +1655,6 @@ struct read_directory_changes_request struct request_header __header; unsigned int filter; obj_handle_t handle; - obj_handle_t event; int subtree; int want_data; async_data_t async; @@ -4700,6 +4699,6 @@ union generic_reply struct allocate_locally_unique_id_reply allocate_locally_unique_id_reply; }; -#define SERVER_PROTOCOL_VERSION 284 +#define SERVER_PROTOCOL_VERSION 285 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/server/change.c b/server/change.c index b556a12415..4ecbc46442 100644 --- a/server/change.c +++ b/server/change.c @@ -282,10 +282,7 @@ void do_change_notify( int unix_fd ) static void dir_signal_changed( struct dir *dir ) { - if (dir->event) - set_event( dir->event ); - else - wake_up( &dir->obj, 0 ); + if (!dir->event) wake_up( &dir->obj, 0 ); } /* SIGIO callback, called synchronously with the poll loop */ @@ -347,11 +344,7 @@ static void dir_destroy( struct object *obj ) async_terminate_queue( &dir->change_q, STATUS_CANCELLED ); while ((record = get_first_change_record( dir ))) free( record ); - if (dir->event) - { - set_event( dir->event ); - release_object( dir->event ); - } + if (dir->event) release_object( dir->event ); release_object( dir->fd ); if (inotify_fd && list_empty( &change_list )) @@ -1088,19 +1081,16 @@ DECL_HANDLER(read_directory_changes) return; /* possibly send changes through an event flag */ - if (req->event) - { - event = get_event_obj( current->process, req->event, EVENT_MODIFY_STATE ); - if (!event) - goto end; - } + if (req->async.event && + !(event = get_event_obj( current->process, req->async.event, EVENT_MODIFY_STATE ))) + goto end; /* discard the current data, and move onto the next event */ if (dir->event) release_object( dir->event ); dir->event = event; /* requests don't timeout */ - if (!create_async( current, NULL, &dir->change_q, &req->async )) return; + if (!create_async( current, NULL, &dir->change_q, &req->async )) goto end; /* assign it once */ if (!dir->filter) @@ -1116,10 +1106,6 @@ DECL_HANDLER(read_directory_changes) if (dir->signaled>0) dir->signaled--; - /* clear the event */ - if (event) - reset_event( event ); - /* if there's already a change in the queue, send it */ if (!list_empty( &dir->change_q ) && !list_empty( &dir->change_records )) diff --git a/server/protocol.def b/server/protocol.def index 3d0618a708..1e7cb8b298 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -1299,7 +1299,6 @@ enum char_info_mode @REQ(read_directory_changes) unsigned int filter; /* notification filter */ obj_handle_t handle; /* handle to the directory */ - obj_handle_t event; /* handle to the event */ int subtree; /* watch the subtree? */ int want_data; /* flag indicating whether change data should be collected */ async_data_t async; /* async I/O parameters */ diff --git a/server/trace.c b/server/trace.c index d04c4c5244..ed42650515 100644 --- a/server/trace.c +++ b/server/trace.c @@ -1655,7 +1655,6 @@ static void dump_read_directory_changes_request( const struct read_directory_cha { fprintf( stderr, " filter=%08x,", req->filter ); fprintf( stderr, " handle=%p,", req->handle ); - fprintf( stderr, " event=%p,", req->event ); fprintf( stderr, " subtree=%d,", req->subtree ); fprintf( stderr, " want_data=%d,", req->want_data ); fprintf( stderr, " async=" ); -- 2.32.0.93.g670b81a890