summaryrefslogtreecommitdiff
path: root/listener.c
diff options
context:
space:
mode:
authorChristopher Davis <chrisd@torproject.org>2010-10-28 10:08:17 -0700
committerNick Mathewson <nickm@torproject.org>2010-10-28 14:11:33 -0400
commit7b40a0005062e67423f5217e1c8082d0f7d36f1b (patch)
tree9121630fa4ebc40a00ffb94f15333f71593324cc /listener.c
parent19c71e7454305e4e10c7d0c6ed1520fe5e1521df (diff)
downloadlibevent-7b40a0005062e67423f5217e1c8082d0f7d36f1b.tar.gz
Make sure IOCP evconnlistener uses virtual events.
Diffstat (limited to 'listener.c')
-rw-r--r--listener.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/listener.c b/listener.c
index 3052169d..5a521985 100644
--- a/listener.c
+++ b/listener.c
@@ -55,6 +55,7 @@
#ifdef WIN32
#include "iocp-internal.h"
#include "defer-internal.h"
+#include "event-internal.h"
#endif
struct evconnlistener_ops {
@@ -90,6 +91,7 @@ struct evconnlistener_iocp {
struct event_iocp_port *port;
short n_accepting;
unsigned shutting_down : 1;
+ unsigned event_added : 1;
struct accepting_socket **accepting;
};
#endif
@@ -442,6 +444,26 @@ static void accepted_socket_cb(struct event_overlapped *o, ev_uintptr_t key,
ev_ssize_t n, int ok);
static void accepted_socket_invoke_user_cb(struct deferred_cb *cb, void *arg);
+static void
+iocp_listener_event_add(struct evconnlistener_iocp *lev)
+{
+ if (lev->event_added)
+ return;
+
+ lev->event_added = 1;
+ event_base_add_virtual(lev->event_base);
+}
+
+static void
+iocp_listener_event_del(struct evconnlistener_iocp *lev)
+{
+ if (!lev->event_added)
+ return;
+
+ lev->event_added = 0;
+ event_base_del_virtual(lev->event_base);
+}
+
static struct accepting_socket *
new_accepting_socket(struct evconnlistener_iocp *lev, int family)
{
@@ -660,6 +682,7 @@ iocp_listener_enable(struct evconnlistener *lev)
EVUTIL_UPCAST(lev, struct evconnlistener_iocp, base);
LOCK(lev);
+ iocp_listener_event_add(lev_iocp);
for (i = 0; i < lev_iocp->n_accepting; ++i) {
struct accepting_socket *as = lev_iocp->accepting[i];
if (!as)
@@ -681,6 +704,7 @@ iocp_listener_disable_impl(struct evconnlistener *lev, int shutdown)
EVUTIL_UPCAST(lev, struct evconnlistener_iocp, base);
LOCK(lev);
+ iocp_listener_event_del(lev_iocp);
for (i = 0; i < lev_iocp->n_accepting; ++i) {
struct accepting_socket *as = lev_iocp->accepting[i];
if (!as)
@@ -814,6 +838,8 @@ evconnlistener_new_async(struct event_base *base,
++lev->base.refcnt;
}
+ iocp_listener_event_add(lev);
+
return &lev->base;
err_free_accepting: