From 3fc440edab402b924d8af56e87b803ef8d7e02ba Mon Sep 17 00:00:00 2001 From: Laurence Withers Date: Mon, 5 Nov 2007 10:42:39 +0000 Subject: [PATCH] Add dynamic resizing of returned events array if we keep getting too many events --- src/liblwevent/200_eventloop.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/liblwevent/200_eventloop.c b/src/liblwevent/200_eventloop.c index 6b39ef2..2931303 100644 --- a/src/liblwevent/200_eventloop.c +++ b/src/liblwevent/200_eventloop.c @@ -129,6 +129,7 @@ int lwevent_wait(int timeout_ms) { int ret, i, revents; struct lwevent* ev; + struct epoll_event* new_revents; _lwevent_invalid_head = 0; @@ -150,14 +151,24 @@ int lwevent_wait(int timeout_ms) ev->callback(ev, revents); } + /* possibly resize returned events array */ + ++_lw_revents_count; + if(i == ret) ++_lw_revents_overcount; + if(_lw_revents_overcount >= 4 && _lw_revents_overcount >= (_lw_revents_count >> 2)) { + new_revents = malloc(sizeof(struct epoll_event) * (_lw_revents_size << 1)); + if(new_revents) { + free(_lw_revents); + _lw_revents = new_revents; + _lw_revents_size <<= 1; + } + } + /* free any invalid struct lwevent objects */ for(ev = _lwevent_invalid_head; ev; ev = _lwevent_invalid_head) { _lwevent_invalid_head = _lwevent_invalid_head->invalid_next; free(ev); } - /* TODO: possibly resize returned events array */ - return ret; }