actors: Avoid building up stack of error handlers when resuming coroutines.
authorChristopher Allan Webber <cwebber@dustycloud.org>
Mon, 30 Jan 2017 05:10:13 +0000 (23:10 -0600)
committerChristopher Allan Webber <cwebber@dustycloud.org>
Mon, 30 Jan 2017 05:10:13 +0000 (23:10 -0600)
However it's not clear that we're not still building up a stack of
prompts. :\

* 8sync/actors.scm (hive-process-message): Avoid building up stack of
error handlers when resuming coroutines.

8sync/actors.scm

index fdeccf39090d6cddb9cdbd273f3db2a616c00d5b..ceb2980f533e93eab250c85e908dd05e6f885edf 100644 (file)
@@ -562,7 +562,9 @@ to come after class definition."
                  message))
       actor))
 
-  (define (call-catching-coroutine thunk)
+  ;; TODO: I'm pretty sure we're building up another stack of prompts here
+  ;;   with the way we're doing this.  That's a real problem.
+  (define* (call-catching-coroutine thunk #:optional (catch-errors #t))
     (define queued-error-handling-thunk #f)
     (define (call-catching-errors)
       ;; TODO: maybe parameterize (or attach to hive) and use
@@ -591,7 +593,9 @@ to come after class definition."
       (if queued-error-handling-thunk
           (8sync (queued-error-handling-thunk))))
     (call-with-prompt (hive-prompt hive)
-      call-catching-errors
+      (if catch-errors
+          call-catching-errors
+          thunk)
       (lambda (kont actor message send-options)
         ;; Register the coroutine
         (hash-set! (hive-waiting-coroutines hive)
@@ -641,7 +645,9 @@ to come after class definition."
                result))
             (#f (throw 'no-waiting-coroutine
                        "message in-reply-to tries to resume nonexistent coroutine"
-                       message))))))
+                       message))))
+        ;; no need to catch errors here, there's already an error handler
+        #f))
       ;; Unhandled action for a reply!
       (else
        (throw 'hive-unresumable-coroutine