src/server/daemon/event_solaris.c

changeset 529
cd606400f0ba
parent 443
ef3c8a0e1fee
child 531
9b15b1f72bef
--- a/src/server/daemon/event_solaris.c	Sun Jun 02 10:22:12 2024 +0200
+++ b/src/server/daemon/event_solaris.c	Sun Jun 02 12:39:04 2024 +0200
@@ -61,8 +61,11 @@
     return ev;
 }
 
+#define EV_MAX_EVENTS 32
+
 void ev_handle_events(EventHandler *ev) {   
-    port_event_t events[64];
+    port_event_t events[EV_MAX_EVENTS];
+    Event *finished[EV_MAX_EVENTS];
     struct timespec timeout;
     timeout.tv_nsec = 0;
     timeout.tv_sec = 600;
@@ -70,13 +73,14 @@
     for(;;) {
         // wait for events
         uint_t nev = 1;
-        int ret = port_getn(ev->port, events, 64, &nev, &timeout);
+        int ret = port_getn(ev->port, events, EV_MAX_EVENTS, &nev, &timeout);
         if(ret == -1) {
             // TODO: check for error
             perror("port_getn");
             continue;
         }
         
+        int numfinished = 0;
         for(int i=0;i<nev;i++) {
             Event *event = events[i].portev_user;
             if(events[i].portev_source == PORT_SOURCE_AIO) {
@@ -87,7 +91,7 @@
                     aio->result_errno = aiocb->aio_resultp.aio_errno;
                     if(event->fn) {
                         if(!event->fn(ev, event) && event->finish) {
-                            event->finish(ev, event);
+                            finished[numfinished++] = event;
                         }
                     }
                 }
@@ -115,6 +119,11 @@
                 }
             }  
         }
+        // call event finish handlers
+        for(int i=0;i<numfinished;i++) {
+            Event *event = finished[i];
+            finished[i]->finish(ev, event);
+        }
     }
 }
 

mercurial