src/server/daemon/event_bsd.c

changeset 529
cd606400f0ba
parent 503
aeaf7db26fac
child 531
9b15b1f72bef
--- 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<nev;i++) {
             Event *event = (Event*)events[i].udata;
             if(!event) {
@@ -101,7 +106,7 @@
                     // ret 0 => 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;i<numfinished;i++) {
+            Event *event = finished[i];
+            finished[i]->finish(ev, event);
+        }
     }
 }
 

mercurial