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; }