src/server/daemon/event_solaris.c

changeset 43
8ac56edb4e94
parent 35
4417619a9bbd
child 44
3da1f7b6847f
equal deleted inserted replaced
42:cb9c63c1edee 43:8ac56edb4e94
101 } 101 }
102 102
103 for(int i=0;i<nev;i++) { 103 for(int i=0;i<nev;i++) {
104 event_t *event = events[i].portev_user; 104 event_t *event = events[i].portev_user;
105 if(event->fn) { 105 if(event->fn) {
106 event->fn(ev, event); 106 if(event->fn(ev, event)) {
107 /*
108 * on solaris we have to reassociate the fd after
109 * each event
110 * we do this if the event function returns 1
111 */
112 if(ev_poll(ev, event)) {
113 perror("port_associate");
114 }
115 }
107 } 116 }
108 } 117 }
109 } 118 }
110 } 119 }
111 120
122 return h->ports[cp]; 131 return h->ports[cp];
123 } 132 }
124 133
125 int ev_pollin(event_handler_t *h, int fd, event_t *event) { 134 int ev_pollin(event_handler_t *h, int fd, event_t *event) {
126 event->object = (intptr_t)fd; 135 event->object = (intptr_t)fd;
136 event->events = POLLIN;
127 return port_associate( 137 return port_associate(
128 ev_get_port(h), 138 ev_get_port(h),
129 PORT_SOURCE_FD, 139 PORT_SOURCE_FD,
130 (uintptr_t)fd, 140 (uintptr_t)fd,
131 POLLIN, 141 POLLIN,
132 event); 142 event);
133 } 143 }
134 144
135 int ev_pollout(event_handler_t *h, int fd, event_t *event) { 145 int ev_pollout(event_handler_t *h, int fd, event_t *event) {
136 event->object = (intptr_t)fd; 146 event->object = (intptr_t)fd;
147 event->events = POLLOUT;
137 return port_associate( 148 return port_associate(
138 ev_get_port(h), 149 ev_get_port(h),
139 PORT_SOURCE_FD, 150 PORT_SOURCE_FD,
140 (uintptr_t)fd, 151 (uintptr_t)fd,
141 POLLOUT, 152 POLLOUT,
142 event); 153 event);
143 } 154 }
144 155
156 int ev_poll(event_handler_t *h, event_t *event) {
157 return port_associate(
158 ev_get_port(h),
159 PORT_SOURCE_FD,
160 event->object,
161 event->events,
162 event);
163 }
164
145 int evt_send(event_handler_t *h, event_t *event) { 165 int evt_send(event_handler_t *h, event_t *event) {
146 event->object = 0; 166 event->object = 0;
147 return port_send(ev_get_port(h), 0, event); 167 return port_send(ev_get_port(h), 0, event);
148 } 168 }

mercurial