mirror of
https://github.com/libevent/libevent.git
synced 2025-01-31 09:12:55 +08:00
Compilation and correctness fixes for IOCP listener code.
svn:r1489
This commit is contained in:
parent
8283b2f0dc
commit
9a772148f2
18
listener.c
18
listener.c
@ -333,7 +333,7 @@ static void
|
|||||||
free_and_unlock_accepting_socket(struct accepting_socket *as)
|
free_and_unlock_accepting_socket(struct accepting_socket *as)
|
||||||
{
|
{
|
||||||
/* requires lock. */
|
/* requires lock. */
|
||||||
if (res->s != INVALID_SOCKET)
|
if (as->s != INVALID_SOCKET)
|
||||||
closesocket(as->s);
|
closesocket(as->s);
|
||||||
|
|
||||||
LeaveCriticalSection(&as->lock);
|
LeaveCriticalSection(&as->lock);
|
||||||
@ -376,7 +376,9 @@ start_accepting(struct accepting_socket *as)
|
|||||||
int err = WSAGetLastError();
|
int err = WSAGetLastError();
|
||||||
if (err == ERROR_IO_PENDING)
|
if (err == ERROR_IO_PENDING)
|
||||||
result = 0;
|
result = 0;
|
||||||
event_sock_warn(as->lev->fd, "AcceptEx");
|
else
|
||||||
|
event_warnx("AcceptEx: %s",
|
||||||
|
evutil_socket_error_to_string(err));
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
@ -384,11 +386,13 @@ done:
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
static void
|
static void
|
||||||
stop_accepting(struct accepting_socket *as)
|
stop_accepting(struct accepting_socket *as)
|
||||||
{
|
{
|
||||||
/* XXX */
|
/* XXX */
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
accepted_socket_cb(struct event_overlapped *o, uintptr_t key, ev_ssize_t n)
|
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_local, &socklen_local,
|
||||||
&sa_remote, &socklen_remote);
|
&sa_remote, &socklen_remote);
|
||||||
|
|
||||||
as->s = INVALID_SOCKET;
|
|
||||||
|
|
||||||
as->lev->base.cb(&as->lev->base, as->s, sa_remote, socklen_remote,
|
as->lev->base.cb(&as->lev->base, as->s, sa_remote, socklen_remote,
|
||||||
as->lev->base.user_data);
|
as->lev->base.user_data);
|
||||||
|
|
||||||
|
as->s = INVALID_SOCKET;
|
||||||
|
|
||||||
/* Avoid stack overflow XXXX */
|
/* Avoid stack overflow XXXX */
|
||||||
start_accepting(as);
|
start_accepting(as);
|
||||||
}
|
}
|
||||||
@ -448,7 +452,7 @@ iocp_listener_getbase(struct evconnlistener *lev)
|
|||||||
{
|
{
|
||||||
struct evconnlistener_iocp *lev_iocp =
|
struct evconnlistener_iocp *lev_iocp =
|
||||||
EVUTIL_UPCAST(lev, struct evconnlistener_iocp, base);
|
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 = {
|
static const struct evconnlistener_ops evconnlistener_iocp_ops = {
|
||||||
@ -497,7 +501,7 @@ evconnlistener_new_async(struct event_base *base,
|
|||||||
lev->event_base = base;
|
lev->event_base = base;
|
||||||
|
|
||||||
if (event_iocp_port_associate(lev->port, fd, 1) < 0)
|
if (event_iocp_port_associate(lev->port, fd, 1) < 0)
|
||||||
return -1;
|
return NULL;
|
||||||
|
|
||||||
lev->n_accepting = 1;
|
lev->n_accepting = 1;
|
||||||
lev->accepting = mm_calloc(1, sizeof(struct accepting_socket *));
|
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) {
|
if (start_accepting(lev->accepting[0]) < 0) {
|
||||||
event_warnx("Couldn't start accepting on socket");
|
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]);
|
free_and_unlock_accepting_socket(lev->accepting[0]);
|
||||||
mm_free(lev->accepting);
|
mm_free(lev->accepting);
|
||||||
mm_free(lev);
|
mm_free(lev);
|
||||||
|
@ -49,6 +49,7 @@ extern struct testcase_t minheap_testcases[];
|
|||||||
extern struct testcase_t iocp_testcases[];
|
extern struct testcase_t iocp_testcases[];
|
||||||
extern struct testcase_t ssl_testcases[];
|
extern struct testcase_t ssl_testcases[];
|
||||||
extern struct testcase_t listener_testcases[];
|
extern struct testcase_t listener_testcases[];
|
||||||
|
extern struct testcase_t listener_iocp_testcases[];
|
||||||
|
|
||||||
void regress_threads(void *);
|
void regress_threads(void *);
|
||||||
void test_bufferevent_zlib(void *);
|
void test_bufferevent_zlib(void *);
|
||||||
|
@ -31,6 +31,9 @@
|
|||||||
#include <event2/buffer.h>
|
#include <event2/buffer.h>
|
||||||
#include <event2/bufferevent.h>
|
#include <event2/bufferevent.h>
|
||||||
|
|
||||||
|
#include <winsock2.h>
|
||||||
|
#include <ws2tcpip.h>
|
||||||
|
|
||||||
#include "regress.h"
|
#include "regress.h"
|
||||||
#include "tinytest.h"
|
#include "tinytest.h"
|
||||||
#include "tinytest_macros.h"
|
#include "tinytest_macros.h"
|
||||||
|
@ -112,6 +112,7 @@ regress_pick_a_port(void *arg)
|
|||||||
evutil_socket_connect(&fd3, (struct sockaddr*)&ss2, slen2);
|
evutil_socket_connect(&fd3, (struct sockaddr*)&ss2, slen2);
|
||||||
|
|
||||||
event_base_dispatch(base);
|
event_base_dispatch(base);
|
||||||
|
// Sleep(2000);
|
||||||
|
|
||||||
tt_int_op(count1, ==, 0);
|
tt_int_op(count1, ==, 0);
|
||||||
tt_int_op(count2, ==, 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,
|
{ "randport", regress_pick_a_port, TT_FORK|TT_NEED_BASE,
|
||||||
&basic_setup, NULL},
|
&basic_setup, NULL},
|
||||||
|
|
||||||
|
END_OF_TESTCASES,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct testcase_t listener_iocp_testcases[] = {
|
||||||
{ "iocp/randport", regress_pick_a_port,
|
{ "iocp/randport", regress_pick_a_port,
|
||||||
TT_FORK|TT_NEED_BASE|TT_ENABLE_IOCP,
|
TT_FORK|TT_NEED_BASE|TT_ENABLE_IOCP,
|
||||||
&basic_setup, NULL},
|
&basic_setup, NULL},
|
||||||
|
@ -319,8 +319,9 @@ struct testgroup_t testgroups[] = {
|
|||||||
{ "listener/", listener_testcases },
|
{ "listener/", listener_testcases },
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
{ "iocp/", iocp_testcases },
|
{ "iocp/", iocp_testcases },
|
||||||
#endif
|
|
||||||
{ "iocp/bufferevent/", bufferevent_iocp_testcases },
|
{ "iocp/bufferevent/", bufferevent_iocp_testcases },
|
||||||
|
{ "iocp/listener/", listener_iocp_testcases },
|
||||||
|
#endif
|
||||||
#ifdef _EVENT_HAVE_OPENSSL
|
#ifdef _EVENT_HAVE_OPENSSL
|
||||||
{ "ssl/", ssl_testcases },
|
{ "ssl/", ssl_testcases },
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user