*/
static int fr_event_fd_delete_internal(fr_event_fd_t *ef)
{
+ int i;
struct kevent evset[10];
int count = 0;
fr_event_list_t *el;
rbtree_deletebydata(el->fds, ef);
ef->is_registered = false;
+ /*
+ * If there are pending events for this FD, go mark them
+ * as deleted.
+ */
+ for (i = 0; i < el->num_fd_events; i++) {
+ if (((el->events[i].filter == EVFILT_READ) ||
+ (el->events[i].filter == EVFILT_WRITE) ||
+ (el->events[i].filter == EVFILT_VNODE)) &&
+ (el->events[i].udata == ef)) {
+ el->events[i].udata = NULL;
+ }
+ }
+
el->num_fds--;
return 0;
continue;
}
+ /*
+ * Skip events for deleted FDs.
+ */
+ if (!el->events[i].udata) continue;
+
ef = talloc_get_type_abort(el->events[i].udata, fr_event_fd_t);
if (!fr_cond_assert(ef->is_registered)) continue;