80 } |
80 } |
81 |
81 |
82 numchanges = 0; |
82 numchanges = 0; |
83 for(int i=0;i<nev;i++) { |
83 for(int i=0;i<nev;i++) { |
84 Event *event = (Event*)events[i].udata; |
84 Event *event = (Event*)events[i].udata; |
|
85 if(!event) { |
|
86 log_ereport(LOG_WARN, "Unknown kevent (ident=%d)", (int)events[i].ident); |
|
87 continue; |
|
88 } |
|
89 |
85 if(event->fn) { |
90 if(event->fn) { |
86 int ep = event->events; |
91 u_short kev_flag = 0; |
87 if(event->fn(ev, event)) { |
92 int saved_ev = event->events; |
88 if(event->events != ep) { |
93 if(!event->fn(ev, event)) { |
89 changes[numchanges++].filter = ev_convert2sys_events(ep); |
94 // ret 0 => remove event |
|
95 kev_flag = EV_DELETE; |
|
96 |
|
97 if(event->finish) { |
|
98 event->finish(ev, event); |
90 } |
99 } |
91 } else if(event->finish) { |
100 } else if(saved_ev != event->events) { |
92 changes[numchanges++].filter = ev_convert2sys_events(ep); |
101 // events changed |
93 event->finish(ev, event); |
102 kev_flag = EV_ADD; |
|
103 events[i].filter = ev_convert2sys_events(event->events); |
|
104 } |
|
105 |
|
106 if(kev_flag) { |
|
107 // copy current event to changelist |
|
108 changes[numchanges] = events[i]; |
|
109 changes[numchanges].flags = kev_flag; |
|
110 numchanges++; |
94 } |
111 } |
95 } |
112 } |
96 } |
113 } |
97 } |
114 } |
98 } |
115 } |