Skip to content

Instantly share code, notes, and snippets.

@jollm
Created February 7, 2012 09:46
Show Gist options
  • Save jollm/1758803 to your computer and use it in GitHub Desktop.
Save jollm/1758803 to your computer and use it in GitHub Desktop.
from iolib, would expect to see harvest events in stacktrace, but instead see dispatch-fd-events-once
(defun dispatch-fd-events-once (event-base timeout now)
(loop
:with fd-events := (harvest-events (mux-of event-base) timeout)
:for ev :in fd-events
:for dlist := (%handle-one-fd event-base ev now nil)
:then (%handle-one-fd event-base ev now dlist)
:finally
(priority-queue-reorder (fd-timers-of event-base))
(return (values (consp fd-events) dlist))))
(defmethod harvest-events ((mux epoll-multiplexer) timeout)
(with-foreign-object (events 'isys:epoll-event +epoll-max-events+)
(isys:bzero events (* +epoll-max-events+ isys:size-of-epoll-event))
(let (ready-fds)
(isys:repeat-upon-condition-decreasing-timeout
((isys:eintr) tmp-timeout timeout)
(setf ready-fds (isys:epoll-wait (fd-of mux) events +epoll-max-events+
(timeout->milliseconds tmp-timeout))))
(macrolet ((epoll-slot (slot-name)
`(foreign-slot-value (mem-aref events 'isys:epoll-event i)
'isys:epoll-event ',slot-name)))
(return*
(loop :for i :below ready-fds
:for fd := (foreign-slot-value (epoll-slot isys:data) 'isys:epoll-data 'isys:fd)
:for event-mask := (epoll-slot isys:events)
:for epoll-event := (make-epoll-event fd event-mask)
:when epoll-event :collect epoll-event))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment