|
|
@@ -193,13 +193,14 @@ static void set_kevent_fd_pointers (BReactor *bsys)
|
|
|
for (int i = 0; i < bsys->kevent_results_num; i++) {
|
|
|
struct kevent *event = &bsys->kevent_results[i];
|
|
|
ASSERT(event->udata)
|
|
|
+
|
|
|
int *tag = event->udata;
|
|
|
switch (*tag) {
|
|
|
case KEVENT_TAG_FD: {
|
|
|
BFileDescriptor *bfd = UPPER_OBJECT(tag, BFileDescriptor, kevent_tag);
|
|
|
ASSERT(bfd->active)
|
|
|
- ASSERT(!bfd->kevent_returned_ptr)
|
|
|
- bfd->kevent_returned_ptr = (int **)&event->udata;
|
|
|
+ bsys->kevent_prev_event[i] = bfd->kevent_last_event;
|
|
|
+ bfd->kevent_last_event = i;
|
|
|
} break;
|
|
|
|
|
|
case KEVENT_TAG_KEVENT: {
|
|
|
@@ -873,7 +874,8 @@ int BReactor_Exec (BReactor *bsys)
|
|
|
// dispatch kevent
|
|
|
if (bsys->kevent_results_pos < bsys->kevent_results_num) {
|
|
|
// grab event
|
|
|
- struct kevent *event = &bsys->kevent_results[bsys->kevent_results_pos];
|
|
|
+ int event_index = bsys->kevent_results_pos;
|
|
|
+ struct kevent *event = &bsys->kevent_results[event_index];
|
|
|
bsys->kevent_results_pos++;
|
|
|
|
|
|
// check if the event was removed
|
|
|
@@ -888,10 +890,11 @@ int BReactor_Exec (BReactor *bsys)
|
|
|
// get BFileDescriptor
|
|
|
BFileDescriptor *bfd = UPPER_OBJECT(tag, BFileDescriptor, kevent_tag);
|
|
|
ASSERT(bfd->active)
|
|
|
- ASSERT(bfd->kevent_returned_ptr == (int **)&event->udata)
|
|
|
|
|
|
- // zero pointer to the kevent entry
|
|
|
- bfd->kevent_returned_ptr = NULL;
|
|
|
+ // when we get to the last event for this fd, reset kevent_last_event
|
|
|
+ if (event_index == bfd->kevent_last_event) {
|
|
|
+ bfd->kevent_last_event = -1;
|
|
|
+ }
|
|
|
|
|
|
// calculate event to report
|
|
|
int events = 0;
|
|
|
@@ -1109,8 +1112,8 @@ int BReactor_AddFileDescriptor (BReactor *bsys, BFileDescriptor *bs)
|
|
|
// set kevent tag
|
|
|
bs->kevent_tag = KEVENT_TAG_FD;
|
|
|
|
|
|
- // set kevent returned pointer
|
|
|
- bs->kevent_returned_ptr = NULL;
|
|
|
+ // have no events
|
|
|
+ bs->kevent_last_event = -1;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
@@ -1163,9 +1166,13 @@ void BReactor_RemoveFileDescriptor (BReactor *bsys, BFileDescriptor *bs)
|
|
|
// delete kevents
|
|
|
update_kevent_fd_events(bsys, bs, 0);
|
|
|
|
|
|
- // write through kevent returned pointer
|
|
|
- if (bs->kevent_returned_ptr) {
|
|
|
- *bs->kevent_returned_ptr = NULL;
|
|
|
+ // invalidate any events
|
|
|
+ int event_index = bs->kevent_last_event;
|
|
|
+ while (event_index != -1) {
|
|
|
+ ASSERT(event_index >= 0 && event_index < bsys->kevent_results_num)
|
|
|
+ struct kevent *event = &bsys->kevent_results[event_index];
|
|
|
+ event->udata = NULL;
|
|
|
+ event_index = bsys->kevent_prev_event[event_index];
|
|
|
}
|
|
|
|
|
|
#endif
|