/usr/lib/threads.scm is in scheme9 2013.11.26-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | ; Scheme 9 from Empty Space, Function Library
; By Nils M Holm, 2010,2012
; Placed in the Public Domain
;
; (thread-create procedure^0) ==> unspecific
; (thread-yield) ==> unspecific
; (thread-exit) ==> unspecific
; (thread-start) ==> unspecific
;
; (load-from-library "threads.scm")
;
; Run cooperative threads. THREAD-CREATE adds a new procedure to be run
; as a thread. THREAD-YIELD is used in a thread to pass control to another
; thread. A thread that does no longer have any work to do should exit
; by calling THREAD-EXIT. If it simply exits without announcing this,
; the scheduler will exit, too. THREAD-START starts all threads created
; earlier with THREAD-CREATE. When THREAD-EXIT is called by the last
; thread in the queue, the scheduler will also exit.
;
; (Example): (define (p n x)
; (lambda ()
; (do ((n n (- n 1)))
; ((negative? n)
; (thread-exit))
; (display x)
; (thread-yield))))
;
; (thread-create (p 100 "A"))
; (thread-create (p 200 "B"))
; (thread-start)
(load-from-library "queue.scm")
(load-from-library "letcc.scm")
(define *thread-queue* (make-queue))
(define (queue-thread thread)
(queue! *thread-queue* thread))
(define (unqueue-thread)
(unqueue! *thread-queue*))
(define (thread-create thunk)
(let/cc k
(queue-thread k)
(thunk)))
(define (thread-yield)
(let/cc k
(queue-thread k)
((unqueue-thread) #t)))
(define thread-cleanup #f)
(define (thread-exit)
(if (queue-empty? *thread-queue*)
(thread-cleanup #t)
((unqueue-thread) #t)))
(define (thread-start)
(let/cc k
(set! thread-cleanup k)
(thread-exit)))
|