source: project/futures/futures-base.scm @ 3

Last change on this file since 3 was 3, checked in by felix winkelmann, 15 years ago

udp/test-infrastructure changes; added futures

File size: 836 bytes
Line 
1;;;; future-base.scm
2
3(use srfi-18)
4
5(declare
6  (fixnum)
7  (export future:make-future future? force) )
8
9(define-record future results exn failed? %complete? thread)
10
11(define (future:make-future thunk)
12  (let* ((f (make-future '() #f #f #f #f))
13         (t (make-thread
14             (lambda ()
15               (handle-exceptions ex
16                   (begin
17                     (future-exn-set! f ex)
18                     (future-failed?-set! f #t) )
19                 (future-results-set! f (receive (thunk))) )
20               (future-%complete?-set! f #t) ) ) ) )
21    (future-thread-set! f t)
22    (thread-start! t)
23    f) )
24
25(set! force
26  (let ((old ##sys#force))
27    (lambda (f)
28      (if (future? f)
29          (let loop ()
30            (cond ((future-failed? f) (raise (future-exn f)))
31                  ((future-%complete? f) (apply values (future-results f)))
32                  (else
33                   (thread-join! (future-thread f))
34                   (loop) ) ) )
35          (old f) ) ) ) )
Note: See TracBrowser for help on using the repository browser.