actors: Add comment about adding deferred-slot to <message>.
[8sync.git] / 8sync / systems / actors.scm
index ce46f63614fb7640eb3db3ee90450cffac999d92..7b47c5faec3626d0770c5b2b1c6668c0ac0a1fca 100644 (file)
@@ -70,7 +70,7 @@
 
             <- <-wait <-reply <-reply-wait
 
-            call-with-message msg-receive =>
+            call-with-message msg-receive
 
             ez-run-hive
             bootstrap-message
 ;;; ========
 
 
+;; @@: We may want to add a deferred-reply to the below, similar to
+;;   what we had in XUDD, for actors which do their own response
+;;   queueing.... ie, that might receive messages but need to shelve
+;;   them to be acted upon after something else is taken care of.
+
 (define-record-type <message>
   (make-message-intern id to from action
                        body in-reply-to wants-reply
@@ -437,7 +442,10 @@ more compact following syntax:
                                     (actor-id hive) '*error*
                                     new-message-body
                                     #:in-reply-to (message-id original-message))))
-    (8sync (hive-process-message hive new-message))))
+    ;; We only return a thunk, rather than run 8sync here, because if
+    ;; we ran 8sync in the middle of a catch we'd end up with an
+    ;; unresumable continuation.
+    (lambda () (hive-process-message hive new-message))))
 
 (define-method (hive-process-message (hive <hive>) message)
   "Handle one message, or forward it via an ambassador"
@@ -459,6 +467,7 @@ more compact following syntax:
       actor))
 
   (define (call-catching-coroutine thunk)
+    (define queued-error-handling-thunk #f)
     (define (call-catching-errors)
       ;; TODO: maybe parameterize (or attach to hive) and use
       ;;   maybe-catch-all from agenda.scm
@@ -475,9 +484,16 @@ more compact following syntax:
           (if (message-needs-reply? message)
               ;; If the message is waiting on a reply, let them know
               ;; something went wrong.
-              (hive-reply-with-error hive message key args))
+              ;; However, we have to do it outside of this catch
+              ;; routine, or we'll end up in an unrewindable continuation
+              ;; situation.
+              (set! queued-error-handling-thunk
+                    (hive-reply-with-error hive message key args)))
           ;; print error message
-          (apply print-error-and-continue key args))))
+          (apply print-error-and-continue key args)))
+      ;; @@: This is a kludge.  See above for why.
+      (if queued-error-handling-thunk
+          (8sync (queued-error-handling-thunk))))
     (call-with-prompt (hive-prompt hive)
       call-catching-errors
       (lambda (kont actor message)
@@ -611,12 +627,6 @@ argument.  Similar to call-with-values in concept."
                      (lambda* arglist
                        body ...)))
 
-;; Emacs: (put '=> 'scheme-indent-function 2)
-;;; An experimental alias.
-(define-syntax-rule (=> rest ...)
-  (msg-receive rest ...))
-
-
 \f
 ;;; Various API methods for actors to interact with the system
 ;;; ==========================================================