;;; -*- mode: scheme; scheme48-package: rendezvous -*- ;;;; Rendezvous Concurrency Abstraction ;;;; Time Rendezvous ;;; Copyright (c) 2005-2009, Taylor R. Campbell ;;; ;;; Redistribution and use in source and binary forms, with or without ;;; modification, are permitted provided that the following conditions ;;; are met: ;;; ;;; * Redistributions of source code must retain the above copyright ;;; notice, this list of conditions and the following disclaimer. ;;; ;;; * Redistributions in binary form must reproduce the above copyright ;;; notice, this list of conditions and the following disclaimer in ;;; the documentation and/or other materials provided with the ;;; distribution. ;;; ;;; * Neither the names of the authors nor the names of contributors ;;; may be used to endorse or promote products derived from this ;;; software without specific prior written permission. ;;; ;;; THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS ;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY ;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;;; Time Rendezvous (define (after-time-rendezvous time-delta) (make-time-rendezvous (lambda () (+ (real-time) time-delta)))) (define (at-real-time-rendezvous time) (make-time-rendezvous (lambda () time))) (define (make-time-rendezvous compute-revival-time) (polling-rendezvous (lambda () (let ((revival-time (compute-revival-time))) (if (> (real-time) revival-time) (values 0 (lambda (prepare-revival) prepare-revival ;ignore ;; Trivially enabled; no revival. (values))) (values #f (lambda (suspension) (register-dozer! revival-time (lambda () ; liveness tester (not (suspension-revived? suspension))) (lambda () ; reviver (enter-critical-region (lambda (critical-token) (maybe-revive suspension critical-token ;; Null continuations. values values))))))))))))