Allow NtFileFlushBuffers to block

Mike McCormack mike at codeweavers.com
Thu May 8 03:52:50 CDT 2003


Hi,

The following patch is used by my next named pipe patch.

Mike


ChangeLog:
* allow NtFileFlushBuffers to block, as flushing a named pipe requires this
-------------- next part --------------
Index: server/fd.c
===================================================================
RCS file: /home/wine/wine/server/fd.c,v
retrieving revision 1.9
diff -u -r1.9 fd.c
--- server/fd.c	17 Apr 2003 02:14:04 -0000	1.9
+++ server/fd.c	8 May 2003 08:45:30 -0000
@@ -958,7 +958,7 @@
 }
 
 /* default flush() routine */
-int no_flush( struct fd *fd )
+int no_flush( struct fd *fd, struct event *event )
 {
     set_error( STATUS_OBJECT_TYPE_MISMATCH );
     return 0;
@@ -997,10 +997,16 @@
 DECL_HANDLER(flush_file)
 {
     struct fd *fd = get_handle_fd_obj( current->process, req->handle, 0 );
+    struct event * event;
 
     if (fd)
     {
-        fd->fd_ops->flush( fd );
+        event = get_event_obj( current->process, req->event, 0);
+        if( event )
+        {
+            fd->fd_ops->flush( fd, event );
+            release_object( event );
+        }
         release_object( fd );
     }
 }
Index: server/file.c
===================================================================
RCS file: /home/wine/wine/server/file.c,v
retrieving revision 1.67
diff -u -r1.67 file.c
--- server/file.c	26 Mar 2003 23:41:43 -0000	1.67
+++ server/file.c	8 May 2003 08:45:30 -0000
@@ -72,7 +72,7 @@
 
 static int file_get_poll_events( struct fd *fd );
 static void file_poll_event( struct fd *fd, int event );
-static int file_flush( struct fd *fd );
+static int file_flush( struct fd *fd, struct event *event );
 static int file_get_info( struct fd *fd, struct get_file_info_reply *reply, int *flags );
 static void file_queue_async( struct fd *fd, void *ptr, unsigned int status, int type, int count );
 
@@ -301,7 +301,7 @@
 }
 
 
-static int file_flush( struct fd *fd )
+static int file_flush( struct fd *fd, struct event *event )
 {
     int ret = (fsync( get_unix_fd(fd) ) != -1);
     if (!ret) file_set_error();
Index: server/file.h
===================================================================
RCS file: /home/wine/wine/server/file.h,v
retrieving revision 1.7
diff -u -r1.7 file.h
--- server/file.h	26 Mar 2003 23:41:43 -0000	1.7
+++ server/file.h	8 May 2003 08:45:30 -0000
@@ -35,7 +35,7 @@
     /* a poll() event occured */
     void (*poll_event)(struct fd *,int event);
     /* flush the object buffers */
-    int  (*flush)(struct fd *);
+    int  (*flush)(struct fd *, struct event *);
     /* get file information */
     int  (*get_file_info)(struct fd *,struct get_file_info_reply *, int *flags);
     /* queue an async operation - see register_async handler in async.c*/
@@ -60,7 +60,7 @@
 extern void default_fd_remove_queue( struct object *obj, struct wait_queue_entry *entry );
 extern int default_fd_signaled( struct object *obj, struct thread *thread );
 extern void default_poll_event( struct fd *fd, int event );
-extern int no_flush( struct fd *fd );
+extern int no_flush( struct fd *fd, struct event *event );
 extern int no_get_file_info( struct fd *fd, struct get_file_info_reply *info, int *flags );
 extern void no_queue_async( struct fd *fd, void* ptr, unsigned int status, int type, int count );
 extern void main_loop(void);
Index: server/protocol.def
===================================================================
RCS file: /home/wine/wine/server/protocol.def,v
retrieving revision 1.65
diff -u -r1.65 protocol.def
--- server/protocol.def	4 Apr 2003 22:26:34 -0000	1.65
+++ server/protocol.def	8 May 2003 08:45:32 -0000
@@ -665,6 +665,7 @@
 /* Flush a file buffers */
 @REQ(flush_file)
     obj_handle_t handle;        /* handle to the file */
+    obj_handle_t event;         /* event to set when finished */
 @END
 
 
Index: dlls/ntdll/file.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/file.c,v
retrieving revision 1.21
diff -u -r1.21 file.c
--- dlls/ntdll/file.c	22 Apr 2003 04:04:17 -0000	1.21
+++ dlls/ntdll/file.c	8 May 2003 08:45:32 -0000
@@ -498,11 +498,21 @@
 NTSTATUS WINAPI NtFlushBuffersFile( HANDLE hFile, IO_STATUS_BLOCK* IoStatusBlock )
 {
     NTSTATUS ret;
+    HANDLE hEvent = NULL;
+
+    ret = NtCreateEvent( &hEvent, GENERIC_READ | SYNCHRONIZE, NULL, 0, 0 );
+    if( ret )
+        return ret;
+
     SERVER_START_REQ( flush_file )
     {
         req->handle = hFile;
+        req->event = hEvent;
         ret = wine_server_call( req );
     }
     SERVER_END_REQ;
+    if( ret == STATUS_PENDING )
+        ret = NtWaitForSingleObject( hEvent, FALSE, NULL );
+    NtClose( hEvent );
     return ret;
 }


More information about the wine-patches mailing list