Alexandre Julliard : server: Use a standard async I/ O event to signal directory changes.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Mar 21 17:02:47 CDT 2007


Module: wine
Branch: master
Commit: 2082a97d45f74f31876c9b65ecebf3107b25cc69
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2082a97d45f74f31876c9b65ecebf3107b25cc69

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Mar 21 14:50:15 2007 +0100

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 410f35c..f03a7b4 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 68cc112..726d833 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 b556a12..4ecbc46 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 3d0618a..1e7cb8b 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 d04c4c5..ed42650 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=" );




More information about the wine-cvs mailing list