]> granicus.if.org Git - libevent/commitdiff
Compilation and correctness fixes for IOCP listener code.
authorNick Mathewson <nickm@torproject.org>
Mon, 2 Nov 2009 19:31:29 +0000 (19:31 +0000)
committerNick Mathewson <nickm@torproject.org>
Mon, 2 Nov 2009 19:31:29 +0000 (19:31 +0000)
svn:r1489

listener.c
test/regress.h
test/regress_iocp.c
test/regress_listener.c
test/regress_main.c

index 6f8f218bcf24c9fa9c533eff8963c48d89536078..8cdaef566d212cb745545003c0436b2313126db1 100644 (file)
@@ -333,7 +333,7 @@ static void
 free_and_unlock_accepting_socket(struct accepting_socket *as)
 {
        /* requires lock. */
-       if (res->s != INVALID_SOCKET)
+       if (as->s != INVALID_SOCKET)
                closesocket(as->s);
 
        LeaveCriticalSection(&as->lock);
@@ -376,7 +376,9 @@ start_accepting(struct accepting_socket *as)
                int err = WSAGetLastError();
                if (err == ERROR_IO_PENDING)
                        result = 0;
-               event_sock_warn(as->lev->fd, "AcceptEx");
+               else
+                       event_warnx("AcceptEx: %s",
+                           evutil_socket_error_to_string(err));
        }
 
 done:
@@ -384,11 +386,13 @@ done:
        return result;
 }
 
+#if 0
 static void
 stop_accepting(struct accepting_socket *as)
 {
        /* XXX */
 }
+#endif
 
 static void
 accepted_socket_cb(struct event_overlapped *o, uintptr_t key, ev_ssize_t n)
@@ -409,11 +413,11 @@ accepted_socket_cb(struct event_overlapped *o, uintptr_t key, ev_ssize_t n)
            &sa_local, &socklen_local,
            &sa_remote, &socklen_remote);
 
-       as->s = INVALID_SOCKET;
-
        as->lev->base.cb(&as->lev->base, as->s, sa_remote, socklen_remote,
            as->lev->base.user_data);
 
+       as->s = INVALID_SOCKET;
+
        /* Avoid stack overflow XXXX */
        start_accepting(as);
 }
@@ -448,7 +452,7 @@ iocp_listener_getbase(struct evconnlistener *lev)
 {
        struct evconnlistener_iocp *lev_iocp =
            EVUTIL_UPCAST(lev, struct evconnlistener_iocp, base);
-       return lev_iocp->event_basex;
+       return lev_iocp->event_base;
 }
 
 static const struct evconnlistener_ops evconnlistener_iocp_ops = {
@@ -497,7 +501,7 @@ evconnlistener_new_async(struct event_base *base,
        lev->event_base = base;
 
        if (event_iocp_port_associate(lev->port, fd, 1) < 0)
-               return -1;
+               return NULL;
 
        lev->n_accepting = 1;
        lev->accepting = mm_calloc(1, sizeof(struct accepting_socket *));
@@ -518,7 +522,7 @@ evconnlistener_new_async(struct event_base *base,
 
        if (start_accepting(lev->accepting[0]) < 0) {
                event_warnx("Couldn't start accepting on socket");
-               EnterCriticalSection(lev->accepting[0]);
+               EnterCriticalSection(&lev->accepting[0]->lock);
                free_and_unlock_accepting_socket(lev->accepting[0]);
                mm_free(lev->accepting);
                mm_free(lev);
index 24f3aa64801b6bfb2754d0ba2235c214f948347e..a586c4f7f00751c03468d8fbc6dc0152beb73e41 100644 (file)
@@ -49,6 +49,7 @@ extern struct testcase_t minheap_testcases[];
 extern struct testcase_t iocp_testcases[];
 extern struct testcase_t ssl_testcases[];
 extern struct testcase_t listener_testcases[];
+extern struct testcase_t listener_iocp_testcases[];
 
 void regress_threads(void *);
 void test_bufferevent_zlib(void *);
index cd28fb7b7419246ab7f8103e8509bc7025eeb67b..724c5c59d1837675530442435888aed0ff3a823e 100644 (file)
@@ -31,6 +31,9 @@
 #include <event2/buffer.h>
 #include <event2/bufferevent.h>
 
+#include <winsock2.h>
+#include <ws2tcpip.h>
+
 #include "regress.h"
 #include "tinytest.h"
 #include "tinytest_macros.h"
index b9de0af32794378e565acce9edfd6e26073a956b..264b0587eccb2d742beca8acba1df8eb5b1f5d69 100644 (file)
@@ -112,6 +112,7 @@ regress_pick_a_port(void *arg)
        evutil_socket_connect(&fd3, (struct sockaddr*)&ss2, slen2);
 
        event_base_dispatch(base);
+       // Sleep(2000);
 
        tt_int_op(count1, ==, 0);
        tt_int_op(count2, ==, 0);
@@ -131,6 +132,10 @@ struct testcase_t listener_testcases[] = {
        { "randport", regress_pick_a_port, TT_FORK|TT_NEED_BASE,
          &basic_setup, NULL},
 
+        END_OF_TESTCASES,
+};
+
+struct testcase_t listener_iocp_testcases[] = {
        { "iocp/randport", regress_pick_a_port,
          TT_FORK|TT_NEED_BASE|TT_ENABLE_IOCP,
          &basic_setup, NULL},
index f4d11c162872c0d8ed3e0f320991e18b44ab6070..2e3839715df37b3a3c50a978f5843cfdeed72be7 100644 (file)
@@ -319,8 +319,9 @@ struct testgroup_t testgroups[] = {
        { "listener/", listener_testcases },
 #ifdef WIN32
        { "iocp/", iocp_testcases },
-#endif
        { "iocp/bufferevent/", bufferevent_iocp_testcases },
+       { "iocp/listener/", listener_iocp_testcases },
+#endif
 #ifdef _EVENT_HAVE_OPENSSL
        { "ssl/", ssl_testcases },
 #endif