diff -r d9c3c23c635b -r 1e1fca11aaff src/server/daemon/event_linux.c --- 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;inthreads;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;ifn) { 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;inumret;i++) { - EVReturn ret = ev->fnreturn[i]; + for(int i=0;ibase.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 }; -}