diff options
author | Ambroz Bizjak <ambrop7@gmail.com> | 2015-12-26 01:03:10 +0300 |
---|---|---|
committer | Ambroz Bizjak <ambrop7@gmail.com> | 2015-12-26 01:03:10 +0300 |
commit | 1d2cb74f35e00924e695403b21275ce926a4eae6 (patch) | |
tree | c42eb9d09883c83bf777fb4876b42418b540c8f1 | |
parent | 4b761996519288e4daf0c3379585d1bfb74b93a3 (diff) |
FreeBSD assertion fix attempt.freebsd-fix
-rw-r--r-- | system/BReactor_badvpn.c | 29 | ||||
-rw-r--r-- | system/BReactor_badvpn.h | 3 |
2 files changed, 20 insertions, 12 deletions
diff --git a/system/BReactor_badvpn.c b/system/BReactor_badvpn.c index 1b03d58..ef3ab1a 100644 --- a/system/BReactor_badvpn.c +++ b/system/BReactor_badvpn.c @@ -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 diff --git a/system/BReactor_badvpn.h b/system/BReactor_badvpn.h index 2c5ab4c..f945a00 100644 --- a/system/BReactor_badvpn.h +++ b/system/BReactor_badvpn.h @@ -203,7 +203,7 @@ typedef struct BFileDescriptor_t { #ifdef BADVPN_USE_KEVENT int kevent_tag; - int **kevent_returned_ptr; + int kevent_last_event; #endif #ifdef BADVPN_USE_POLL @@ -265,6 +265,7 @@ typedef struct { #ifdef BADVPN_USE_KEVENT int kqueue_fd; struct kevent kevent_results[BSYSTEM_MAX_RESULTS]; + int kevent_prev_event[BSYSTEM_MAX_RESULTS]; int kevent_results_num; int kevent_results_pos; #endif |