;; dislfuid, implementation of the Solid specification ;; Copyright (C) 2021 Vivien Kraus ;; This program is free software: you can redistribute it and/or modify ;; it under the terms of the GNU Affero General Public License as ;; published by the Free Software Foundation, either version 3 of the ;; License, or (at your option) any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU Affero General Public License for more details. ;; You should have received a copy of the GNU Affero General Public License ;; along with this program. If not, see . (define-module (webid-oidc offloading) #:use-module (ice-9 threads) #:declarative? #t #:export (with-threads in-another-thread)) (define tag (make-prompt-tag)) (define (let-threads-escape thunk) (call-with-prompt tag (lambda () (thunk)) (lambda (k handle-continuation) (handle-continuation k)))) (define (continue-in-another-thread thunk) (abort-to-prompt tag (lambda (continuation) (call-with-new-thread (lambda () (let-threads-escape (lambda () (call-with-values thunk continuation)))))))) (define-syntax-rule (with-threads body ...) (let-threads-escape (lambda () body ...))) (define-syntax-rule (in-another-thread body ...) (continue-in-another-thread (lambda () body ...)))