PATCH: async-sock-server.diff (7 in series)

Martin Wilck Martin.Wilck at fujitsu-siemens.com
Fri Apr 12 10:21:20 CDT 2002


PATCH: async-sock-server.diff

Basic implementation of async IO queues in the server code for sockets.

Patch against:  CVS-2002-04-12, with my sock-fd-type patch applied.

Modified files:
        server: sock.c

diff -ruNX ignore TMP/wine/server/sock.c MW/wine/server/sock.c
--- TMP/wine/server/sock.c	Fri Apr 12 14:38:16 2002
+++ MW/wine/server/sock.c	Fri Apr 12 15:26:36 2002
@@ -86,6 +86,7 @@
 static void sock_destroy( struct object *obj );
 static int sock_get_error( int err );
 static void sock_set_error(void);
+static struct async_queue * sock_queue_async(struct object *obj, struct async* async, int type, int count);

 static const struct object_ops sock_ops =
 {
@@ -100,7 +101,7 @@
     sock_get_fd,                  /* get_fd */
     no_flush,                     /* flush */
     sock_get_info,                /* get_file_info */
-    NULL,                         /* queue_async */
+    sock_queue_async,             /* queue_async */
     sock_destroy                  /* destroy */
 };

@@ -229,6 +230,21 @@
         }
     } else
     {
+
+        if ( sock->flags & WSA_FLAG_OVERLAPPED )
+        {
+            if( IS_READY(sock->read_q) && (POLLIN & event) )
+            {
+                if (debug_level) fprintf ( stderr, "activating read queue for socket %p\n", sock );
+                async_notify(sock->read_q.head, STATUS_ALERTED);
+            }
+            if( IS_READY(sock->write_q) && (POLLOUT & event) )
+            {
+                if (debug_level) fprintf ( stderr, "activating write queue for socket %p\n", sock );
+                async_notify(sock->write_q.head, STATUS_ALERTED);
+            }
+        }
+
         /* normal data flow */
         if (event & POLLIN)
         {
@@ -312,6 +328,8 @@
     int ev = 0;

     assert( obj->ops == &sock_ops );
+    if ( debug_level )
+        fprintf (stderr, "mask: %x %x %x -> %x\n", sock->mask, sock->state, sock->hmask, mask);

     if (sock->state & FD_CONNECT)
         /* connecting, wait for writable */
@@ -320,8 +338,11 @@
         /* listening, wait for readable */
         return (sock->hmask & FD_ACCEPT) ? 0 : POLLIN;

-    if (mask & FD_READ)  ev |= POLLIN | POLLPRI;
-    if (mask & FD_WRITE) ev |= POLLOUT;
+    if (mask & FD_READ || (sock->flags & WSA_FLAG_OVERLAPPED && IS_READY (sock->read_q)))
+        ev |= POLLIN | POLLPRI;
+    if (mask & FD_WRITE || (sock->flags & WSA_FLAG_OVERLAPPED && IS_READY (sock->write_q)))
+        ev |= POLLOUT;
+
     return ev;
 }

@@ -353,6 +374,38 @@
     *flags = 0;
     if (sock->flags & WSA_FLAG_OVERLAPPED) *flags |= FD_FLAG_OVERLAPPED;
     return FD_TYPE_DEFAULT;
+}
+
+static struct async_queue *sock_queue_async(struct object *obj, struct async *async, int type, int count)
+{
+    struct sock *sock = (struct sock *)obj;
+    struct async_queue *q;
+
+    assert( obj->ops == &sock_ops );
+
+    if ( !(sock->flags & WSA_FLAG_OVERLAPPED) )
+    {
+        set_error ( STATUS_INVALID_HANDLE );
+        return NULL;
+    }
+
+    switch(type)
+    {
+    case ASYNC_TYPE_READ:
+        q = &sock->read_q;
+        break;
+    case ASYNC_TYPE_WRITE:
+        q = &sock->write_q;
+        break;
+    default:
+        set_error( STATUS_INVALID_PARAMETER );
+        return NULL;
+    }
+
+    if(async && !async->q)
+        async_insert(q, async);
+
+    return q;
 }

 static void sock_destroy( struct object *obj )







More information about the wine-devel mailing list