Mike Kaplinskiy : server: Move signaling FD_* events to a separate function .

Alexandre Julliard julliard at winehq.org
Tue Jul 20 11:20:32 CDT 2010


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

Author: Mike Kaplinskiy <mike.kaplinskiy at gmail.com>
Date:   Sat Jul 17 22:06:49 2010 -0400

server: Move signaling FD_* events to a separate function.

---

 server/sock.c |  112 ++++++++++++++++++++++++++++----------------------------
 1 files changed, 56 insertions(+), 56 deletions(-)

diff --git a/server/sock.c b/server/sock.c
index 9cd0fc2..5d48c2d 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -312,10 +312,60 @@ static void sock_dispatch_asyncs( struct sock *sock, int event )
     }
 }
 
+static void sock_dispatch_events( struct sock *sock, int prevstate, int event, int error )
+{
+    if (prevstate & FD_CONNECT)
+    {
+        sock->pmask |= FD_CONNECT;
+        sock->hmask |= FD_CONNECT;
+        sock->errors[FD_CONNECT_BIT] = error;
+        goto end;
+    }
+    if (prevstate & FD_WINE_LISTENING)
+    {
+        sock->pmask |= FD_ACCEPT;
+        sock->hmask |= FD_ACCEPT;
+        sock->errors[FD_ACCEPT_BIT] = error;
+        goto end;
+    }
+
+    if (event & POLLIN)
+    {
+        sock->pmask |= FD_READ;
+        sock->hmask |= FD_READ;
+        sock->errors[FD_READ_BIT] = 0;
+    }
+
+    if (event & POLLOUT)
+    {
+        sock->pmask |= FD_WRITE;
+        sock->hmask |= FD_WRITE;
+        sock->errors[FD_WRITE_BIT] = 0;
+    }
+
+    if (event & POLLPRI)
+    {
+        sock->pmask |= FD_OOB;
+        sock->hmask |= FD_OOB;
+        sock->errors[FD_OOB_BIT] = 0;
+    }
+
+    if (event & (POLLERR|POLLHUP))
+    {
+        sock->pmask |= FD_CLOSE;
+        sock->hmask |= FD_CLOSE;
+        sock->errors[FD_CLOSE_BIT] = error;
+    }
+end:
+    sock_wake_up( sock );
+}
+
 static void sock_poll_event( struct fd *fd, int event )
 {
     struct sock *sock = get_fd_user( fd );
     int hangup_seen = 0;
+    int prevstate = sock->state;
+    int error = 0;
 
     assert( sock->obj.ops == &sock_ops );
     if (debug_level)
@@ -332,38 +382,19 @@ static void sock_poll_event( struct fd *fd, int event )
             /* we got connected */
             sock->state |= FD_WINE_CONNECTED|FD_READ|FD_WRITE;
             sock->state &= ~FD_CONNECT;
-            sock->pmask |= FD_CONNECT;
-            sock->errors[FD_CONNECT_BIT] = 0;
-            if (debug_level)
-                fprintf(stderr, "socket %p connection success\n", sock);
         }
         else if (event & (POLLERR|POLLHUP))
         {
             /* we didn't get connected? */
             sock->state &= ~FD_CONNECT;
-            sock->pmask |= FD_CONNECT;
-            sock->errors[FD_CONNECT_BIT] = sock_error( fd );
-            if (debug_level)
-                fprintf(stderr, "socket %p connection failure\n", sock);
+            error = sock_error( fd );
         }
     }
     else if (sock->state & FD_WINE_LISTENING)
     {
         /* listening */
-        if (event & POLLIN)
-        {
-            /* incoming connection */
-            sock->pmask |= FD_ACCEPT;
-            sock->errors[FD_ACCEPT_BIT] = 0;
-            sock->hmask |= FD_ACCEPT;
-        }
-        else if (event & (POLLERR|POLLHUP))
-        {
-            /* failed incoming connection? */
-            sock->pmask |= FD_ACCEPT;
-            sock->errors[FD_ACCEPT_BIT] = sock_error( fd );
-            sock->hmask |= FD_ACCEPT;
-        }
+        if (event & (POLLERR|POLLHUP))
+            error = sock_error( fd );
     }
     else
     {
@@ -395,44 +426,15 @@ static void sock_poll_event( struct fd *fd, int event )
             }
         }
 
-        if ( event & POLLIN )
-        {
-            sock->pmask |= FD_READ;
-            sock->hmask |= FD_READ;
-            sock->errors[FD_READ_BIT] = 0;
-            if (debug_level)
-                fprintf(stderr, "socket %p is readable\n", sock );
-        }
-
-        if (event & POLLOUT)
-        {
-            sock->pmask |= FD_WRITE;
-            sock->hmask |= FD_WRITE;
-            sock->errors[FD_WRITE_BIT] = 0;
-            if (debug_level)
-                fprintf(stderr, "socket %p is writable\n", sock);
-        }
-        if (event & POLLPRI)
-        {
-            sock->pmask |= FD_OOB;
-            sock->hmask |= FD_OOB;
-            sock->errors[FD_OOB_BIT] = 0;
-            if (debug_level)
-                fprintf(stderr, "socket %p got OOB data\n", sock);
-        }
-
         if ( (hangup_seen || event & (POLLHUP|POLLERR)) && (sock->state & (FD_READ|FD_WRITE)) )
         {
-            sock->errors[FD_CLOSE_BIT] = sock_error( fd );
+            error = sock_error( fd );
             if ( (event & POLLERR) || ( sock_shutdown_type == SOCK_SHUTDOWN_EOF && (event & POLLHUP) ))
                 sock->state &= ~FD_WRITE;
             sock->state &= ~FD_READ;
 
-            sock->pmask |= FD_CLOSE;
-            sock->hmask |= FD_CLOSE;
             if (debug_level)
-                fprintf(stderr, "socket %p aborted by error %d, event: %x - removing from select loop\n",
-                        sock, sock->errors[FD_CLOSE_BIT], event);
+                fprintf(stderr, "socket %p aborted by error %d, event: %x\n", sock, error, event);
         }
 
         if (hangup_seen)
@@ -440,9 +442,7 @@ static void sock_poll_event( struct fd *fd, int event )
     }
 
     sock_dispatch_asyncs( sock, event );
-
-    /* wake up anyone waiting for whatever just happened */
-    sock_wake_up( sock );
+    sock_dispatch_events( sock, prevstate, event, error );
 
     /* if anyone is stupid enough to wait on the socket object itself,
      * maybe we should wake them up too, just in case? */




More information about the wine-cvs mailing list