23 lines
749 B
Scheme
23 lines
749 B
Scheme
|
(define $threads (foreign-procedure "(cs)threads" () scheme-object))
|
||
|
(define $nthreads 1)
|
||
|
(define $yield
|
||
|
(let ([t (make-time 'time-duration 1000000 0)])
|
||
|
(lambda () (sleep t))))
|
||
|
(define $thread-check
|
||
|
(lambda ()
|
||
|
(let loop ([n 100] [nt (length ($threads))])
|
||
|
(cond
|
||
|
[(<= nt $nthreads)
|
||
|
(set! $nthreads nt)
|
||
|
(collect)]
|
||
|
[else
|
||
|
($yield)
|
||
|
(let* ([ls ($threads)] [nnt (length ls)])
|
||
|
(cond
|
||
|
[(< nnt nt) (loop n nnt)]
|
||
|
[(= n 0)
|
||
|
(set! $nthreads nnt)
|
||
|
(errorf #f "extra threads running ~s" ls)]
|
||
|
[else (loop (- n 1) nnt)]))]))
|
||
|
#t))
|