;;;; A simple example of using a condition variable to simulate thread-join
(import (scheme base)
        (scheme read)
        (scheme write)
        (srfi 18))

(define cv (make-condition-variable))
(define m (make-mutex))

;; Thread - Do something, then let main thread know when we are done
(thread-start!
  (make-thread
    (lambda ()
      (display "started thread")
      (newline)
      (thread-sleep! 3)
      (display "thread done")
      (newline)
      (condition-variable-broadcast! cv))))

;; Main thread - wait for thread to broadcast it is done
(mutex-lock! m)
(mutex-unlock! m cv) ;; Wait on cv
(display "main thread done")
(newline)
(thread-sleep! 0.5)

;(display "thread join")
;(newline)
;(let ((t (make-thread
;            (lambda ()
;              (display "started second thread")
;              (newline)
;              (thread-sleep! 3)
;              (display "thread done")
;              (newline)
;              1))))
;  (thread-start! t)
;  (thread-sleep! 0)
;  (display (thread-join! t))
;  (display "main thread done again")
;  (newline))