summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Allan Webber <cwebber@dustycloud.org>2017-01-29 23:10:13 -0600
committerChristopher Allan Webber <cwebber@dustycloud.org>2017-01-29 23:10:13 -0600
commit17e72389d61d35970bf0de07121b7aa26e11221a (patch)
tree3e31b93dc257c793a0b9a641798f4026e2664f03
parent48dffb1698035eb3e0eed696e2c296e26412b7d7 (diff)
download8sync-17e72389d61d35970bf0de07121b7aa26e11221a.tar.gz
actors: Avoid building up stack of error handlers when resuming coroutines.
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.
-rw-r--r--8sync/actors.scm12
1 files changed, 9 insertions, 3 deletions
diff --git a/8sync/actors.scm b/8sync/actors.scm
index fdeccf3..ceb2980 100644
--- a/8sync/actors.scm
+++ b/8sync/actors.scm
@@ -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