Mike Kaplinskiy : server: Consume events triggered.

Alexandre Julliard julliard at winehq.org
Wed Jul 28 10:45:12 CDT 2010


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

Author: Mike Kaplinskiy <mike.kaplinskiy at gmail.com>
Date:   Tue Jul 27 00:16:18 2010 -0400

server: Consume events triggered.

---

 dlls/ws2_32/tests/sock.c |   10 ----------
 server/sock.c            |    7 +++++--
 2 files changed, 5 insertions(+), 12 deletions(-)

diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 19d29bf..b078b9f 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -3205,16 +3205,6 @@ static void test_events(int useMessages)
     ok_event_seq(src, hEvent, empty_seq, NULL, 0);
     }
 
-    /* wine gets a stale notifications because of the async ops, clear them.
-     * remove when sending messages during pending asyncs is fixed */
-    ret = send(dst, "2", 1, 0);
-    ok(ret == 1, "Failed to send buffer %d err %d\n", ret, GetLastError());
-    ok_event_seq(src, hEvent, read_seq, NULL, 0);
-
-    ret = recv(src, buffer, 1, 0);
-    ok(ret == 1, "Failed to empty buffer: %d - %d\n", ret, GetLastError());
-    ok_event_seq(src, hEvent, empty_seq, NULL, 0);
-
     /* Flood the send queue */
     hThread = CreateThread(NULL, 0, drain_socket_thread, &dst, 0, &id);
     if (hThread == NULL)
diff --git a/server/sock.c b/server/sock.c
index e5681b0..36f6c7a 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -295,7 +295,7 @@ static inline int sock_error( struct fd *fd )
     return optval;
 }
 
-static void sock_dispatch_asyncs( struct sock *sock, int event, int error )
+static int sock_dispatch_asyncs( struct sock *sock, int event, int error )
 {
     if ( sock->flags & WSA_FLAG_OVERLAPPED )
     {
@@ -303,11 +303,13 @@ static void sock_dispatch_asyncs( struct sock *sock, int event, int error )
         {
             if (debug_level) fprintf( stderr, "activating read queue for socket %p\n", sock );
             async_wake_up( sock->read_q, STATUS_ALERTED );
+            event &= ~(POLLIN|POLLPRI);
         }
         if ( event & POLLOUT && async_waiting( sock->write_q ) )
         {
             if (debug_level) fprintf( stderr, "activating write queue for socket %p\n", sock );
             async_wake_up( sock->write_q, STATUS_ALERTED );
+            event &= ~POLLOUT;
         }
         if ( event & (POLLERR|POLLHUP) )
         {
@@ -319,6 +321,7 @@ static void sock_dispatch_asyncs( struct sock *sock, int event, int error )
                 async_wake_up( sock->write_q, status );
         }
     }
+    return event;
 }
 
 static void sock_dispatch_events( struct sock *sock, int prevstate, int event, int error )
@@ -451,7 +454,7 @@ static void sock_poll_event( struct fd *fd, int event )
             event |= POLLHUP;
     }
 
-    sock_dispatch_asyncs( sock, event, error );
+    event = sock_dispatch_asyncs( sock, event, error );
     sock_dispatch_events( sock, prevstate, event, error );
 
     /* if anyone is stupid enough to wait on the socket object itself,




More information about the wine-cvs mailing list