Alexandre Julliard : server: Avoid redundant polling in fd_queue_async_timeout.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Apr 2 06:23:22 CDT 2007


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Apr  2 12:48:13 2007 +0200

server: Avoid redundant polling in fd_queue_async_timeout.

Moved the file overlapped flag check to default_fd_queue_async.

---

 server/fd.c       |   33 +++++++++++++++++----------------
 server/file.h     |    4 ++--
 server/mailslot.c |    2 +-
 3 files changed, 20 insertions(+), 19 deletions(-)

diff --git a/server/fd.c b/server/fd.c
index d353aca..baab135 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -1719,18 +1719,10 @@ void default_poll_event( struct fd *fd, int event )
     wake_up( fd->user, 0 );
 }
 
-void fd_queue_async_timeout( struct fd *fd, const async_data_t *data, int type, int count,
-                             const struct timeval *timeout )
+int fd_queue_async_timeout( struct fd *fd, const async_data_t *data, int type, int count,
+                            const struct timeval *timeout )
 {
     struct list *queue;
-    int events, flags;
-
-    fd->fd_ops->get_file_info( fd, &flags );
-    if (!(flags & (FD_FLAG_OVERLAPPED|FD_FLAG_TIMEOUT)))
-    {
-        set_error( STATUS_INVALID_HANDLE );
-        return;
-    }
 
     switch (type)
     {
@@ -1745,17 +1737,18 @@ void fd_queue_async_timeout( struct fd *fd, const async_data_t *data, int type,
         break;
     default:
         set_error( STATUS_INVALID_PARAMETER );
-        return;
+        return 0;
     }
 
-    if (!create_async( current, timeout, queue, data )) return;
+    if (!create_async( current, timeout, queue, data )) return 0;
     set_error( STATUS_PENDING );
 
-    /* Check if the new pending request can be served immediately */
-    events = check_fd_events( fd, fd->fd_ops->get_poll_events( fd ) );
-    if (events) fd->fd_ops->poll_event( fd, events );
+    if (!fd->inode)
+        set_fd_events( fd, fd->fd_ops->get_poll_events( fd ) );
+    else  /* regular files are always ready for read and write */
+        if (type != ASYNC_TYPE_WAIT) async_terminate_head( queue, STATUS_ALERTED );
 
-    set_fd_events( fd, fd->fd_ops->get_poll_events( fd ) );
+    return 1;
 }
 
 void fd_async_terminate_head( struct fd *fd, int type, unsigned int status )
@@ -1796,6 +1789,14 @@ void fd_async_terminate_queue( struct fd *fd, int type, unsigned int status )
 
 void default_fd_queue_async( struct fd *fd, const async_data_t *data, int type, int count )
 {
+    int flags;
+
+    fd->fd_ops->get_file_info( fd, &flags );
+    if (!(flags & (FD_FLAG_OVERLAPPED|FD_FLAG_TIMEOUT)))
+    {
+        set_error( STATUS_INVALID_HANDLE );
+        return;
+    }
     fd_queue_async_timeout( fd, data, type, count, NULL );
 }
 
diff --git a/server/file.h b/server/file.h
index 507d14c..f0f3a6b 100644
--- a/server/file.h
+++ b/server/file.h
@@ -68,8 +68,8 @@ extern void default_fd_remove_queue( struct object *obj, struct wait_queue_entry
 extern int default_fd_signaled( struct object *obj, struct thread *thread );
 extern int default_fd_get_poll_events( struct fd *fd );
 extern void default_poll_event( struct fd *fd, int event );
-extern void fd_queue_async_timeout( struct fd *fd, const async_data_t *data, int type,
-                                    int count, const struct timeval *timeout );
+extern int fd_queue_async_timeout( struct fd *fd, const async_data_t *data, int type,
+                                   int count, const struct timeval *timeout );
 extern void fd_async_terminate_head( struct fd *fd, int type, unsigned int status );
 extern void fd_async_terminate_queue( struct fd *fd, int type, unsigned int status );
 extern void default_fd_queue_async( struct fd *fd, const async_data_t *data, int type, int count );
diff --git a/server/mailslot.c b/server/mailslot.c
index cf0950d..bd637f2 100644
--- a/server/mailslot.c
+++ b/server/mailslot.c
@@ -302,7 +302,7 @@ static void mailslot_queue_async( struct fd *fd, const async_data_t *data, int t
     if (mailslot->read_timeout != -1)
     {
         struct timeval when = current_time;
-        add_timeout( &when, mailslot->read_timeout );
+        add_timeout( &when, max(1,mailslot->read_timeout) );
         fd_queue_async_timeout( fd, data, type, count, &when );
     }
     else fd_queue_async_timeout( fd, data, type, count, NULL );




More information about the wine-cvs mailing list