anchor.diff:    (element-type)
     (buffer (error "no buffer supplied") :read-only t)
     (cv (make-condition-variable))
  -  (lock (make-mutex "fifo-lock" :spin)))
  +  (lock (make-mutex "fifo-lock")))
   
   (defun make-fifo (size &key (element-type 't))
  -  ;; TODO: non-t element types.
     (%make-fifo :size size
  -              :buffer (sys.int::make-simple-vector size :wired)
  -              :element-type 't))
  +              :buffer (make-array size :element-type element-type)
  +              :element-type element-type))
   
   (defun fifo-push (value fifo &optional (wait-p t))
     "Push a byte onto FIFO. Returns true if successful.
   If the fifo is full, then FIFO-PUSH will wait for space to become available
  -when WAIT-P is true, otherwise it will immediately return false.
  -May be used from an interrupt handler if WAIT-P is false."
  +when WAIT-P is true, otherwise it will immediately return false."
     (with-mutex ((fifo-lock fifo))
       (loop
          (let ((next (1+ (fifo-tail fifo))))
  
positive.code:            (setf next 0))
           ;; When next reaches head, the buffer is full.
           (unless (= next (fifo-head fifo))
             (setf (svref (fifo-buffer fifo) (fifo-tail fifo)) value
                   (fifo-tail fifo) next)
             (condition-notify (fifo-cv fifo))
             (return t)))
  
negative.code:                        (fifo-lock fifo)))))
  
  (defun fifo-reset (fifo)
    "Flush any waiting data."
    (with-mutex ((fifo-lock fifo))
      (setf (fifo-head fifo) 0
            (fifo-tail fifo) 0)
  