--- 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,