60 |
60 |
61 return ev; |
61 return ev; |
62 } |
62 } |
63 |
63 |
64 |
64 |
|
65 #define EV_MAX_EVENTS 32 |
|
66 |
65 void ev_handle_events(EventHandler *ev) { |
67 void ev_handle_events(EventHandler *ev) { |
66 struct timespec timeout; |
68 struct timespec timeout; |
67 timeout.tv_nsec = 0; |
69 timeout.tv_nsec = 0; |
68 timeout.tv_sec = 600; |
70 timeout.tv_sec = 600; |
69 |
71 |
70 struct kevent events[64]; |
72 struct kevent events[EV_MAX_EVENTS]; |
71 struct kevent changes[128]; |
73 struct kevent changes[EV_MAX_EVENTS*2]; |
|
74 Event *finished[EV_MAX_EVENTS]; |
72 int numchanges = 0; |
75 int numchanges = 0; |
|
76 int numfinished; |
73 |
77 |
74 for(;;) { |
78 for(;;) { |
75 // wait for events |
79 // wait for events |
76 int nev = kevent(ev->kqueue, changes, numchanges, events, 64, &timeout); |
80 int nev = kevent(ev->kqueue, changes, numchanges, events, EV_MAX_EVENTS, &timeout); |
77 if(nev == -1) { |
81 if(nev == -1) { |
78 log_ereport(LOG_FAILURE, "kevent: %s", strerror(errno)); |
82 log_ereport(LOG_FAILURE, "kevent: %s", strerror(errno)); |
79 continue; |
83 continue; |
80 } |
84 } |
81 |
85 |
82 numchanges = 0; |
86 numchanges = 0; |
|
87 int numfinished = 0; |
83 for(int i=0;i<nev;i++) { |
88 for(int i=0;i<nev;i++) { |
84 Event *event = (Event*)events[i].udata; |
89 Event *event = (Event*)events[i].udata; |
85 if(!event) { |
90 if(!event) { |
86 if(events[i].flags == 0) { |
91 if(events[i].flags == 0) { |
87 log_ereport(LOG_WARN, "Unknown kevent (ident=%d)", (int)events[i].ident); |
92 log_ereport(LOG_WARN, "Unknown kevent (ident=%d)", (int)events[i].ident); |
99 int saved_ev = event->events; |
104 int saved_ev = event->events; |
100 if(!event->fn(ev, event)) { |
105 if(!event->fn(ev, event)) { |
101 // ret 0 => remove event |
106 // ret 0 => remove event |
102 |
107 |
103 if(event->finish) { |
108 if(event->finish) { |
104 event->finish(ev, event); |
109 finished[numfinished++] = event; |
105 } |
110 } |
106 |
111 |
107 event_events = 0; |
112 event_events = 0; |
108 } else { |
113 } else { |
109 event_events = event->events; |
114 event_events = event->events; |