From 819f949f4ab61c4c5add40105d299e73c190e94f Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Fri, 9 Apr 2010 19:16:49 -0400 Subject: [PATCH] Limit the maximum number of events on each socket to 65535 This lets us use less RAM for the evmap_io structure, which in turn can let us have fewer cache misses for evmap operations. --- evmap.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/evmap.c b/evmap.c index 9e32cf06..b11ec3c9 100644 --- a/evmap.c +++ b/evmap.c @@ -56,8 +56,8 @@ */ struct evmap_io { struct event_list events; - unsigned int nread; - unsigned int nwrite; + ev_uint16_t nread; + ev_uint16_t nwrite; }; /* An entry for an evmap_signal list: notes all the events that want to know @@ -295,6 +295,11 @@ evmap_io_add(struct event_base *base, evutil_socket_t fd, struct event *ev) if (++nwrite == 1) res |= EV_WRITE; } + if (EVUTIL_UNLIKELY(nread > 0xffff || nwrite > 0xffff)) { + event_warnx("Too many events reading or writing on fd %d", + (int)fd); + return -1; + } if (res) { void *extra = ((char*)ctx) + sizeof(struct evmap_io); @@ -307,8 +312,8 @@ evmap_io_add(struct event_base *base, evutil_socket_t fd, struct event *ev) retval = 1; } - ctx->nread = nread; - ctx->nwrite = nwrite; + ctx->nread = (ev_uint16_t) nread; + ctx->nwrite = (ev_uint16_t) nwrite; TAILQ_INSERT_TAIL(&ctx->events, ev, ev_io_next); return (retval); -- 2.40.0