mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-17 08:17:42 -04:00
Make iocp/listener/error work; don't accept again if lev is disabled.
This commit is contained in:
parent
481ef92086
commit
62b429afa8
@ -89,6 +89,7 @@ struct evconnlistener_iocp {
|
|||||||
struct event_iocp_port *port;
|
struct event_iocp_port *port;
|
||||||
short n_accepting;
|
short n_accepting;
|
||||||
short shutting_down;
|
short shutting_down;
|
||||||
|
short enabled;
|
||||||
struct accepting_socket **accepting;
|
struct accepting_socket **accepting;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
@ -472,6 +473,10 @@ start_accepting(struct accepting_socket *as)
|
|||||||
DWORD pending = 0;
|
DWORD pending = 0;
|
||||||
SOCKET s = socket(as->family, SOCK_STREAM, 0);
|
SOCKET s = socket(as->family, SOCK_STREAM, 0);
|
||||||
int error = 0;
|
int error = 0;
|
||||||
|
|
||||||
|
if (!as->lev->enabled)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (s == INVALID_SOCKET) {
|
if (s == INVALID_SOCKET) {
|
||||||
error = WSAGetLastError();
|
error = WSAGetLastError();
|
||||||
goto report_err;
|
goto report_err;
|
||||||
@ -633,6 +638,7 @@ iocp_listener_enable(struct evconnlistener *lev)
|
|||||||
EVUTIL_UPCAST(lev, struct evconnlistener_iocp, base);
|
EVUTIL_UPCAST(lev, struct evconnlistener_iocp, base);
|
||||||
|
|
||||||
LOCK(lev);
|
LOCK(lev);
|
||||||
|
lev_iocp->enabled = 1;
|
||||||
for (i = 0; i < lev_iocp->n_accepting; ++i) {
|
for (i = 0; i < lev_iocp->n_accepting; ++i) {
|
||||||
struct accepting_socket *as = lev_iocp->accepting[i];
|
struct accepting_socket *as = lev_iocp->accepting[i];
|
||||||
if (!as)
|
if (!as)
|
||||||
@ -654,6 +660,7 @@ iocp_listener_disable_impl(struct evconnlistener *lev, int shutdown)
|
|||||||
EVUTIL_UPCAST(lev, struct evconnlistener_iocp, base);
|
EVUTIL_UPCAST(lev, struct evconnlistener_iocp, base);
|
||||||
|
|
||||||
LOCK(lev);
|
LOCK(lev);
|
||||||
|
lev_iocp->enabled = 0;
|
||||||
for (i = 0; i < lev_iocp->n_accepting; ++i) {
|
for (i = 0; i < lev_iocp->n_accepting; ++i) {
|
||||||
struct accepting_socket *as = lev_iocp->accepting[i];
|
struct accepting_socket *as = lev_iocp->accepting[i];
|
||||||
if (!as)
|
if (!as)
|
||||||
@ -757,6 +764,7 @@ evconnlistener_new_async(struct event_base *base,
|
|||||||
lev->port = event_base_get_iocp(base);
|
lev->port = event_base_get_iocp(base);
|
||||||
lev->fd = fd;
|
lev->fd = fd;
|
||||||
lev->event_base = base;
|
lev->event_base = base;
|
||||||
|
lev->enabled = 1;
|
||||||
|
|
||||||
if (event_iocp_port_associate(lev->port, fd, 1) < 0)
|
if (event_iocp_port_associate(lev->port, fd, 1) < 0)
|
||||||
goto err_free_lev;
|
goto err_free_lev;
|
||||||
|
@ -204,8 +204,7 @@ struct testcase_t listener_iocp_testcases[] = {
|
|||||||
&basic_setup, NULL},
|
&basic_setup, NULL},
|
||||||
|
|
||||||
{ "error", regress_listener_error,
|
{ "error", regress_listener_error,
|
||||||
TT_FORK|TT_NEED_BASE|TT_NEED_SOCKETPAIR|TT_ENABLE_IOCP
|
TT_FORK|TT_NEED_BASE|TT_NEED_SOCKETPAIR|TT_ENABLE_IOCP,
|
||||||
|TT_SKIP/*Remove once err-handling on IOCP listeners is ok*/,
|
|
||||||
&basic_setup, NULL},
|
&basic_setup, NULL},
|
||||||
|
|
||||||
END_OF_TESTCASES,
|
END_OF_TESTCASES,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user