From 51c15a31043883a976234d80d8b037c34dcd4952 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Sun, 9 Aug 2020 18:06:12 -0400 Subject: [PATCH] Initial file --- examples/callbacks/complex-scm-call.scm | 47 +++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 examples/callbacks/complex-scm-call.scm diff --git a/examples/callbacks/complex-scm-call.scm b/examples/callbacks/complex-scm-call.scm new file mode 100644 index 00000000..064247f4 --- /dev/null +++ b/examples/callbacks/complex-scm-call.scm @@ -0,0 +1,47 @@ +(import (scheme base) + (scheme write) + (srfi 1) + (srfi 18)) + +(include-c-header "sys.h") + +(define lock (make-mutex)) +(define *done* #f) +(define *dummy signal-done) ;; Hack to prevent optimizing out signal-done + +(define-c start-c-thread + "(void *data, int argc, closure _, object k)" + "start_c_thread(data); + return_closcall1(data, k, boolean_t); ") + +;; TODO: this does not work right now, it crashes because we are not setup for GC! + +;; Signal (wait) that it is done, this is called from C +(define (signal-done obj) + (let ((result 0)) + (for-each + (lambda (n) + (set! result (+ result n)) + ) + (iota 1000)) + + (write `(Called from C set *done* to ,obj)) + (newline) + (mutex-lock! lock) + (set! *done* obj) + (mutex-unlock! lock) + result)) + +;; More efficient to use a condition var here to signal ready, +;; but this is just an example +(define (wait) + (thread-sleep! 1) + (mutex-lock! lock) + (define done *done*) + (mutex-unlock! lock) + (if done + #t + (wait))) + +(start-c-thread) ;; Spawn a separate C thread since main thread runs Scheme +(wait) ;; Wait for the signal