70 struct kevent changes[64]; |
70 struct kevent changes[64]; |
71 int numchanges = 0; |
71 int numchanges = 0; |
72 |
72 |
73 for(;;) { |
73 for(;;) { |
74 // wait for events |
74 // wait for events |
75 int nev = kevent(ev->kqueue, changes, numchanges, events, 64, &timeout); |
75 int nev = kevent(ev->kqueue, changes, numchanges, events, 64, &timeout); |
76 if(nev == -1) { |
76 if(nev == -1) { |
77 // TODO: check for error |
77 // TODO: check for error |
78 perror("kevent"); |
78 perror("kevent"); |
79 continue; |
79 continue; |
80 } |
80 } |
90 if(event->fn) { |
90 if(event->fn) { |
91 u_short kev_flag = 0; |
91 u_short kev_flag = 0; |
92 int saved_ev = event->events; |
92 int saved_ev = event->events; |
93 if(!event->fn(ev, event)) { |
93 if(!event->fn(ev, event)) { |
94 // ret 0 => remove event |
94 // ret 0 => remove event |
95 kev_flag = EV_DELETE; |
95 kev_flag = EV_DELETE; |
96 |
|
97 if(event->finish) { |
96 if(event->finish) { |
98 event->finish(ev, event); |
97 event->finish(ev, event); |
99 } |
98 } |
100 } else if(saved_ev != event->events) { |
99 } else if(saved_ev != event->events) { |
101 // events changed |
100 // events changed |
138 EV_SET(&kev, fd, EVFILT_WRITE, EV_ADD, 0, 0, event); |
137 EV_SET(&kev, fd, EVFILT_WRITE, EV_ADD, 0, 0, event); |
139 return kevent(h->kqueue, &kev, 1, NULL, 0, NULL); |
138 return kevent(h->kqueue, &kev, 1, NULL, 0, NULL); |
140 } |
139 } |
141 |
140 |
142 int ev_remove_poll(EventHandler *h, int fd) { |
141 int ev_remove_poll(EventHandler *h, int fd) { |
143 // TODO: |
142 struct kevent kev; |
144 return 0; |
143 EV_SET(&kev, fd, EVFILT_READ, EV_DELETE, 0, 0, NULL); |
|
144 int r1 = kevent(h->kqueue, &kev, 1, NULL, 0, NULL); |
|
145 EV_SET(&kev, fd, EVFILT_WRITE, EV_DELETE, 0, 0, NULL); |
|
146 int r2 = kevent(h->kqueue, &kev, 1, NULL, 0, NULL); |
|
147 // in caase r1 or r2 was successful, we return 0 (no error) |
|
148 return r1 != -1 || r2 != -1 ? 0 : 1; |
145 } |
149 } |
146 |
150 |
147 int event_send(EventHandler *h, Event *event) { |
151 int event_send(EventHandler *h, Event *event) { |
148 return 0; |
152 return 0; |
149 } |
153 } |