summaryrefslogtreecommitdiff
path: root/fibers
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2017-02-07 10:10:49 +0100
committerAndy Wingo <wingo@pobox.com>2017-02-07 10:10:49 +0100
commit7a16d371c60cb85dacd45b7e9e367617dcea2b5d (patch)
treead44abeab4c57e49e69c6ac6c9b2512a715acd29 /fibers
parentUpdate doc version. (diff)
downloadguile-fibers-7a16d371c60cb85dacd45b7e9e367617dcea2b5d.tar.gz
Better exception handling
* fibers/internal.scm (create-fiber): Add a start-stack and a catch-all around the fiber thunk. Note that in practice this needs the recent post-2.1.6 patch in Guile (498f3f95684361f3591106a8f9cb9065fd649288) to work well.
Diffstat (limited to 'fibers')
-rw-r--r--fibers/internal.scm21
1 files changed, 17 insertions, 4 deletions
diff --git a/fibers/internal.scm b/fibers/internal.scm
index 332b4b5..a495eb1 100644
--- a/fibers/internal.scm
+++ b/fibers/internal.scm
@@ -367,10 +367,23 @@ parameter mutations to the fiber."
(let* ((fiber (make-fiber sched #f))
(thunk (let ((dynamic-state (current-dynamic-state)))
(lambda ()
- (with-dynamic-state dynamic-state
- (lambda ()
- (current-fiber fiber)
- (thunk)))))))
+ (with-dynamic-state
+ dynamic-state
+ (lambda ()
+ (current-fiber fiber)
+ (catch #t
+ (lambda ()
+ (%start-stack #t thunk))
+ (lambda _ #f)
+ (let ((err (current-error-port)))
+ (lambda (key . args)
+ (false-if-exception
+ (let ((stack (make-stack #t 4)))
+ (format err "Uncaught exception in fiber #~a:\n"
+ (nameset-ref fibers-nameset fiber))
+ (display-backtrace stack err)
+ (print-exception err (stack-ref stack 0)
+ key args))))))))))))
(nameset-add! fibers-nameset fiber)
(schedule-fiber! fiber thunk)))