diff -r 8206bfafb7a6 -r cd606400f0ba src/server/daemon/event_bsd.c --- a/src/server/daemon/event_bsd.c Sun Jun 02 10:22:12 2024 +0200 +++ b/src/server/daemon/event_bsd.c Sun Jun 02 12:39:04 2024 +0200 @@ -62,24 +62,29 @@ } +#define EV_MAX_EVENTS 32 + void ev_handle_events(EventHandler *ev) { struct timespec timeout; timeout.tv_nsec = 0; timeout.tv_sec = 600; - struct kevent events[64]; - struct kevent changes[128]; + struct kevent events[EV_MAX_EVENTS]; + struct kevent changes[EV_MAX_EVENTS*2]; + Event *finished[EV_MAX_EVENTS]; int numchanges = 0; + int numfinished; for(;;) { // wait for events - int nev = kevent(ev->kqueue, changes, numchanges, events, 64, &timeout); + int nev = kevent(ev->kqueue, changes, numchanges, events, EV_MAX_EVENTS, &timeout); if(nev == -1) { log_ereport(LOG_FAILURE, "kevent: %s", strerror(errno)); continue; } numchanges = 0; + int numfinished = 0; for(int i=0;i remove event if(event->finish) { - event->finish(ev, event); + finished[numfinished++] = event; } event_events = 0; @@ -134,6 +139,11 @@ } } } + // call event finish handlers + for(int i=0;ifinish(ev, event); + } } }