1;;; 2;;; srfi-124 - Ephemerons 3;;; 4;;; Copyright (c) 2019-2020 Shiro Kawai <shiro@acm.org> 5;;; 6;;; Redistribution and use in source and binary forms, with or without 7;;; modification, are permitted provided that the following conditions 8;;; are met: 9;;; 10;;; 1. Redistributions of source code must retain the above copyright 11;;; notice, this list of conditions and the following disclaimer. 12;;; 13;;; 2. Redistributions in binary form must reproduce the above copyright 14;;; notice, this list of conditions and the following disclaimer in the 15;;; documentation and/or other materials provided with the distribution. 16;;; 17;;; 3. Neither the name of the authors nor the names of its contributors 18;;; may be used to endorse or promote products derived from this 19;;; software without specific prior written permission. 20;;; 21;;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22;;; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23;;; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24;;; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25;;; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26;;; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 27;;; TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 28;;; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 29;;; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 30;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 31;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32;;; 33 34;; NB: This is an *incomplete* emulation of ephemerons. Notably, 35;; if a key has a strong reference from its datum, the key won't be 36;; collected even if it is not strongly referenced from elsewhere. 37;; The complete implementation would require to cooperate closely with GC. 38 39(define-module srfi-124 40 (use gauche.record) 41 (export ephemeron? make-ephemeron ephemeron-broken? 42 ephemeron-key ephemeron-datum 43 reference-barrier)) 44(select-module srfi-124) 45 46(define-record-type <ephemeron> %make-ephemeron ephemeron? 47 (key-box %ephemeron-key-box) 48 (datum ephemeron-datum %ephemeron-datum-set!)) 49 50(define *broken-mark* (list 'broken)) 51 52(define (make-ephemeron key datum) 53 (let1 v (make-weak-vector 1) 54 (weak-vector-set! v 0 key) 55 (%make-ephemeron v datum))) 56 57(define (ephemeron-broken? e) 58 (let1 k (weak-vector-ref (%ephemeron-key-box e) 0 *broken-mark*) 59 (and (eq? k *broken-mark*) 60 (begin (%ephemeron-datum-set! e #f) ; remove ref to datum 61 #t)))) 62 63(define (ephemeron-key e) 64 (weak-vector-ref (%ephemeron-key-box e) 0 #f)) 65 66(define (reference-barrier key) #t) 67 68 69 70 71 72