src/server/daemon/event_solaris.c

changeset 133
87b405d61f64
parent 79
f48cea237ec3
child 153
85320d8b5d5c
--- a/src/server/daemon/event_solaris.c	Tue Dec 27 14:02:28 2016 +0100
+++ b/src/server/daemon/event_solaris.c	Tue Dec 27 17:19:00 2016 +0100
@@ -100,15 +100,28 @@
         for(int i=0;i<nev;i++) {
             event_t *event = events[i].portev_user;
             if(event->fn) {
+                int saved_ev = event->poll;
                 if(event->fn(ev, event)) {
                     /*
                      * on solaris we have to reassociate the fd after
                      * each event
                      * we do this if the event function returns 1
                      */
-                     if(ev_poll(ev, event)) {
-                         perror("port_associate");
-                     }                 
+                    
+                    if(event->poll != saved_ev) {
+                        // event type changed
+                        int ne = 0;
+                        if((event->poll & EVENT_POLLIN) == EVENT_POLLIN) {
+                            ne |= POLLIN;
+                        }
+                        if((event->poll & EVENT_POLLOUT) == EVENT_POLLOUT) {
+                            ne |= POLLOUT;
+                        }
+                    }
+                    
+                    if(ev_poll(ev, event)) {
+                        perror("port_associate");
+                    }                 
                 } else if(event->finish) {
                     event->finish(ev, event);
                 }
@@ -133,6 +146,7 @@
 int ev_pollin(event_handler_t *h, int fd, event_t *event) {
     event->object = (intptr_t)fd;
     event->events = POLLIN;
+    event->poll = EVENT_POLLIN;
     return port_associate(
             ev_get_port(h),
             PORT_SOURCE_FD,
@@ -144,6 +158,7 @@
 int ev_pollout(event_handler_t *h, int fd, event_t *event) {
     event->object = (intptr_t)fd;
     event->events = POLLOUT;
+    event->poll EVENT_POLLOUT;
     return port_associate(
             ev_get_port(h),
             PORT_SOURCE_FD,

mercurial