anchor.diff:          (msg-callback (proclock (process :message-callback) (process-message-callback process))))
       (if (and mailbox msg-callback)
           (handler-case
  -          (progn
  +          (let ((processed-messages nil))
               ;; grab all our pending messages and process them
               (loop while (not (jpl-queues:empty? mailbox)) do
                 (let ((message (jpl-queues:dequeue mailbox)))
  +                (setf processed-messages t)
  +                ;; so we don't timeout prematurely...
  +                (setf (timerdata process :last-run) (get-internal-real-time))
                   (funcall msg-callback message)))
  +            ;; if messages were processed, reset the timeout timer (if we've got
  +            ;; one)
  +            (when (and (timerdata process :timeout)
  +                       processed-messages)
  +              (reset-timeout process))
               ;; mark the process as no longer queued (can now be activate again)
               (proclock (process :queued) (setf (process-queued process) nil)))
             (t (e) (log:error "process: message poller: ~a" e)))
  
positive.code:         (funcall process-definition)
          (error 'process-not-defined))))
  
  ;;; ----------------------------------------------------------------------------
  ;;; main API
  ;;; ----------------------------------------------------------------------------
  
negative.code:   `(bt:with-lock-held ((getf (process-locks ,process) ,field))
       ,@body))
  
  (defmacro timerdata (process field)
    "Grabs timer data."
    `(getf (process-timer ,process) ,field))
  
  (defun generate-process-id ()
    "Get a new process ID (unique)."
    (bt:with-lock-held (*next-id-lock*)
  