mirror of
https://github.com/justinethier/cyclone.git
synced 2025-05-18 21:29:18 +02:00
37 lines
917 B
Scheme
37 lines
917 B
Scheme
(import (scheme base)
|
|
(scheme write)
|
|
(srfi 18))
|
|
|
|
(include-c-header "basic.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); ")
|
|
|
|
;; Signal (wait) that it is done, this is called from C
|
|
(define (signal-done obj)
|
|
(write `(Called from C set *done* to ,obj))
|
|
(newline)
|
|
(mutex-lock! lock)
|
|
(set! *done* obj)
|
|
(mutex-unlock! lock)
|
|
#u8(1 2 3))
|
|
|
|
;; 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
|