src/server/daemon/event_bsd.c

changeset 529
cd606400f0ba
parent 503
aeaf7db26fac
child 531
9b15b1f72bef
equal deleted inserted replaced
528:8206bfafb7a6 529:cd606400f0ba
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;
132 } 137 }
133 } 138 }
134 } 139 }
135 } 140 }
136 } 141 }
142 // call event finish handlers
143 for(int i=0;i<numfinished;i++) {
144 Event *event = finished[i];
145 finished[i]->finish(ev, event);
146 }
137 } 147 }
138 } 148 }
139 149
140 int ev_pollin(EventHandler *h, int fd, Event *event) { 150 int ev_pollin(EventHandler *h, int fd, Event *event) {
141 event->events = EVENT_POLLIN; 151 event->events = EVENT_POLLIN;

mercurial