diff --git a/listener.c b/listener.c index 6f8f218b..8cdaef56 100644 --- a/listener.c +++ b/listener.c @@ -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); diff --git a/test/regress.h b/test/regress.h index 24f3aa64..a586c4f7 100644 --- a/test/regress.h +++ b/test/regress.h @@ -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 *); diff --git a/test/regress_iocp.c b/test/regress_iocp.c index cd28fb7b..724c5c59 100644 --- a/test/regress_iocp.c +++ b/test/regress_iocp.c @@ -31,6 +31,9 @@ #include #include +#include +#include + #include "regress.h" #include "tinytest.h" #include "tinytest_macros.h" diff --git a/test/regress_listener.c b/test/regress_listener.c index b9de0af3..264b0587 100644 --- a/test/regress_listener.c +++ b/test/regress_listener.c @@ -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}, diff --git a/test/regress_main.c b/test/regress_main.c index f4d11c16..2e383971 100644 --- a/test/regress_main.c +++ b/test/regress_main.c @@ -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