While looking for the 'right' way to get a SCBL thread to wait for a specified condition as part of an attempt to update port from the CLOCC, I came across this gem in the McCLIM sources.
(declaim (inline yield)) (defun yield () (declare (optimize speed (safety 0))) (sb-alien:alien-funcall (sb-alien:extern-alien "sched_yield" (function sb-alien:int))) (values))
(defun process-wait (reason predicate) (let ((old-state (process-whostate *current-process*))) (unwind-protect (progn (setf old-state (process-whostate *current-process*) (process-whostate *current-process*) reason) (loop (let ((it (funcall predicate))) (when it (return it))) ;(sleep .01) (yield))) (setf (process-whostate *current-process*) old-state))))
Now this will work, but my understanding is when calling sched_yeild, a thread gets completely expired and put at the back of the scheduling queue. What was/is wrong with sleep?