summaryrefslogtreecommitdiff
path: root/src/scm/webid-oidc/offloading.scm
diff options
context:
space:
mode:
Diffstat (limited to 'src/scm/webid-oidc/offloading.scm')
-rw-r--r--src/scm/webid-oidc/offloading.scm48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/scm/webid-oidc/offloading.scm b/src/scm/webid-oidc/offloading.scm
new file mode 100644
index 0000000..9620193
--- /dev/null
+++ b/src/scm/webid-oidc/offloading.scm
@@ -0,0 +1,48 @@
+;; webid-oidc, 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 <https://www.gnu.org/licenses/>.
+
+(define-module (webid-oidc offloading)
+ #:use-module (ice-9 threads)
+ #: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 ...)))