Hello, Under the conditions where there are two or more handlers registered for a single fd in the multiplexer and one of the handlers removes all the fd's callbacks and other callbacks for that fd should have been invoked in the same event-dispath iteration, there is an invocation of a nil callback in event-dispatch. To the best of my knowledge, this patch below fixes it. Thank you. -pete diff --git a/src/multiplex/event-loop.lisp b/src/multiplex/event-loop.lisp index 35879fd..4afba32 100644 --- a/src/multiplex/event-loop.lisp +++ b/src/multiplex/event-loop.lisp @@ -306,7 +306,8 @@ within the extent of BODY. Closes VAR." (setf expired-events nil) (setf (values eventsp deletion-list) (dispatch-fd-events-once event-base poll-timeout now)) - (%remove-handlers event-base deletion-list) + (unless (equal '(nil nil) deletion-list) + (%remove-handlers event-base deletion-list)) (when (expire-pending-timers fd-timers now) (setf eventsp t)) (dispatch-fd-timeouts expired-events) (when (expire-pending-timers timers now) (setf eventsp t)) @@ -352,13 +353,14 @@ within the extent of BODY. Closes VAR." (defun %dispatch-event (fd-entry event-type errorp now) (let ((ev (fd-entry-handler fd-entry event-type))) - (funcall (fd-handler-callback ev) - (fd-entry-fd fd-entry) - event-type - (if errorp :error nil)) - (when-let (timer (fd-handler-timer ev)) - (reschedule-timer-relative-to-now timer now)) - (fd-handler-one-shot-p ev))) + (when ev + (funcall (fd-handler-callback ev) + (fd-entry-fd fd-entry) + event-type + (if errorp :error nil)) + (when-let (timer (fd-handler-timer ev)) + (reschedule-timer-relative-to-now timer now)) + (fd-handler-one-shot-p ev)))) (defun dispatch-fd-timeouts (events) (dolist (ev events)