projects
/
8sync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
actors: Avoid building up stack of error handlers when resuming coroutines.
[8sync.git]
/
8sync
/
actors.scm
diff --git
a/8sync/actors.scm
b/8sync/actors.scm
index fdeccf39090d6cddb9cdbd273f3db2a616c00d5b..ceb2980f533e93eab250c85e908dd05e6f885edf 100644
(file)
--- a/
8sync/actors.scm
+++ b/
8sync/actors.scm
@@
-562,7
+562,9
@@
to come after class definition."
message))
actor))
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
(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)
(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)
(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"
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
;; Unhandled action for a reply!
(else
(throw 'hive-unresumable-coroutine