#lang syndicate ;;; SPDX-License-Identifier: LGPL-3.0-or-later ;;; SPDX-FileCopyrightText: Copyright © 2021 Tony Garnock-Jones (require "stats.rkt") (define (box k LIMIT REPORT_EVERY) (spawn #:name 'box (define root-facet this-facet) (define disarm (facet-prevent-inert-check! this-facet)) (define-field value 0) (define reporter (report-stats REPORT_EVERY)) (send! k (hash 'getter (embedded (object #:name 'subscription-handler [#:asserted observer (log-info "observer ~v" observer) (at (embedded-value observer) (assert (value)))])) 'setter (embedded (object #:name 'update-handler [#:asserted new-value (reporter new-value) (when (= new-value LIMIT) (stop-facet root-facet)) (value new-value)])))))) (define (client getter setter) (log-info "client start") (spawn #:name 'client (define root-facet this-facet) (define count 0) (at getter (assert (embedded (object #:name 'termination-detector [#:asserted _ (set! count (+ count 1)) #:retracted (set! count (- count 1)) (when (zero? count) (log-info "Client detected box termination") (stop-facet root-facet))]))) (assert (embedded (object #:name 'update-handler [#:asserted value (send! setter (+ value 1))])))))) (module+ main (time (actor-system (define root-facet this-facet) (define disarm (facet-prevent-inert-check! this-facet)) (box (object #:name 'box-boot-handler [#:asserted refs (log-info "refs ~v" refs) (match-define (hash-table ('getter (embedded g)) ('setter (embedded s))) refs) (client g s) (stop-facet root-facet)]) 500000 100000))))