From 62b429afa8a8138635a891ff668613e7be3c3aa7 Mon Sep 17 00:00:00 2001 From: Christopher Davis Date: Thu, 7 Oct 2010 13:41:39 -0700 Subject: [PATCH] Make iocp/listener/error work; don't accept again if lev is disabled. --- listener.c | 8 ++++++++ test/regress_listener.c | 3 +-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/listener.c b/listener.c index 8eb5b5fc..bd9cd3f2 100644 --- a/listener.c +++ b/listener.c @@ -89,6 +89,7 @@ struct evconnlistener_iocp { struct event_iocp_port *port; short n_accepting; short shutting_down; + short enabled; struct accepting_socket **accepting; }; #endif @@ -472,6 +473,10 @@ start_accepting(struct accepting_socket *as) DWORD pending = 0; SOCKET s = socket(as->family, SOCK_STREAM, 0); int error = 0; + + if (!as->lev->enabled) + return 0; + if (s == INVALID_SOCKET) { error = WSAGetLastError(); goto report_err; @@ -633,6 +638,7 @@ iocp_listener_enable(struct evconnlistener *lev) EVUTIL_UPCAST(lev, struct evconnlistener_iocp, base); LOCK(lev); + lev_iocp->enabled = 1; for (i = 0; i < lev_iocp->n_accepting; ++i) { struct accepting_socket *as = lev_iocp->accepting[i]; if (!as) @@ -654,6 +660,7 @@ iocp_listener_disable_impl(struct evconnlistener *lev, int shutdown) EVUTIL_UPCAST(lev, struct evconnlistener_iocp, base); LOCK(lev); + lev_iocp->enabled = 0; for (i = 0; i < lev_iocp->n_accepting; ++i) { struct accepting_socket *as = lev_iocp->accepting[i]; if (!as) @@ -757,6 +764,7 @@ evconnlistener_new_async(struct event_base *base, lev->port = event_base_get_iocp(base); lev->fd = fd; lev->event_base = base; + lev->enabled = 1; if (event_iocp_port_associate(lev->port, fd, 1) < 0) goto err_free_lev; diff --git a/test/regress_listener.c b/test/regress_listener.c index ce7e064f..06c3cf5f 100644 --- a/test/regress_listener.c +++ b/test/regress_listener.c @@ -204,8 +204,7 @@ struct testcase_t listener_iocp_testcases[] = { &basic_setup, NULL}, { "error", regress_listener_error, - TT_FORK|TT_NEED_BASE|TT_NEED_SOCKETPAIR|TT_ENABLE_IOCP - |TT_SKIP/*Remove once err-handling on IOCP listeners is ok*/, + TT_FORK|TT_NEED_BASE|TT_NEED_SOCKETPAIR|TT_ENABLE_IOCP, &basic_setup, NULL}, END_OF_TESTCASES,