src/server/daemon/event_linux.c

changeset 541
1e1fca11aaff
parent 537
ad44e72fbf50
child 542
1327febf99c4
--- a/src/server/daemon/event_linux.c	Sun Aug 11 10:09:20 2024 +0200
+++ b/src/server/daemon/event_linux.c	Sun Aug 11 13:26:17 2024 +0200
@@ -50,8 +50,9 @@
     ev->numins = cfg->nthreads;
        
     for(int i=0;i<cfg->nthreads;i++) {
-        EventHandler *handler = malloc(sizeof(EventHandler));
-        ev->instances[i] = handler;
+        EventHandlerLinux *handler = malloc(sizeof(EventHandlerLinux));
+        memset(handler, 0, sizeof(EventHandlerLinux));
+        ev->instances[i] = (EventHandler*)handler;
         
         handler->ep = epoll_create(64);
         if(handler->ep < 0) {
@@ -86,7 +87,8 @@
     return ev;
 }
 
-void ev_handle_events(EventHandler *ev) {
+void ev_handle_events(EventHandlerLinux *ev) {
+    EventHandler *h = (EventHandler*)ev;
     int ep = ev->ep;
     
     struct epoll_event events[EV_MAX_EVENTS];
@@ -101,7 +103,7 @@
         }
         
         int numfinished = 0;
-        ev->numret = 0;
+        ev->base.numret = 0;
         for(int i=0;i<ret;i++) {
             Event *event = events[i].data.ptr;
             if(!event) {
@@ -131,7 +133,7 @@
             
             if(event->fn) {
                 int saved_ev = event->events;
-                if(!event->fn(ev, event)) {
+                if(!event->fn(h, event)) {
                     // event fn returned 0 -> remove event from epoll
                     if(epoll_ctl(ep, EPOLL_CTL_DEL, event->object, NULL)) {
                         event->error = 1;
@@ -173,12 +175,12 @@
             Event *event = finished[i];
             // check again if the finish callback is set
             if(finished[i]->finish) {
-                finished[i]->finish(ev, event);
+                finished[i]->finish(h, event);
             }
         }
         // execute return calls
-        for(int i=0;i<ev->numret;i++) {
-            EVReturn ret = ev->fnreturn[i];
+        for(int i=0;i<ev->base.numret;i++) {
+            EVReturn ret = ev->base.fnreturn[i];
             nsapi_saf_return(ret.sn, ret.rq, ret.ret);
         }
     }
@@ -196,31 +198,35 @@
 }
 
 int ev_pollin(EventHandler *h, int fd, Event *event) {
+    EventHandlerLinux *ev = (EventHandlerLinux*)h;
     event->object = (intptr_t)fd;
     event->events = EVENT_POLLIN;
     struct epoll_event epev;
     epev.events = EPOLLIN | EPOLLET; // input event, edge triggered
     epev.data.ptr = event;
-    return epoll_ctl(h->ep, EPOLL_CTL_ADD, fd, &epev);
+    return epoll_ctl(ev->ep, EPOLL_CTL_ADD, fd, &epev);
 }
 
 int ev_pollout(EventHandler *h, int fd, Event *event) {
+    EventHandlerLinux *ev = (EventHandlerLinux*)h;
     event->object = (intptr_t)fd;
     event->events = EVENT_POLLOUT;
     struct epoll_event epev;
     epev.events = EPOLLOUT | EPOLLET; // input event, edge triggered
     epev.data.ptr = event;
-    return epoll_ctl(h->ep, EPOLL_CTL_ADD, fd, &epev);
+    return epoll_ctl(ev->ep, EPOLL_CTL_ADD, fd, &epev);
 }
 
 int ev_remove_poll(EventHandler *h, int fd) {
-    return epoll_ctl(h->ep, EPOLL_CTL_DEL, fd, NULL);
+    EventHandlerLinux *ev = (EventHandlerLinux*)h;
+    return epoll_ctl(ev->ep, EPOLL_CTL_DEL, fd, NULL);
 }
 
 int event_send(EventHandler *h, Event *event) {
+    EventHandlerLinux *ev = (EventHandlerLinux*)h;
     event->object = 0;
     event->events = 0;
-    ssize_t r = write(h->eventout, &event, sizeof(Event*));
+    ssize_t r = write(ev->eventout, &event, sizeof(Event*));
     if(r < sizeof(Event*)) {
         log_ereport(LOG_FAILURE, "failed to send event: %s", strerror(errno));
     }
@@ -258,8 +264,3 @@
 int event_removepoll(EventHandler *ev, SYS_NETFD fd) {
     return ((IOStream*)fd)->poll(fd, ev, IO_POLL_NONE, NULL);
 }
-
-
-void ev_saf_return(EventHandler *h, Session *sn, Request *rq, int ret) {
-    h->fnreturn[h->numret++] = (EVReturn){ sn, rq, ret };
-}

mercurial