Jelajahi Sumber

FreeBSD assertion fix attempt.

Ambroz Bizjak 10 tahun lalu
induk
melakukan
1d2cb74f35
2 mengubah file dengan 20 tambahan dan 12 penghapusan
  1. 18 11
      system/BReactor_badvpn.c
  2. 2 1
      system/BReactor_badvpn.h

+ 18 - 11
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

+ 2 - 1
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