6 val enque
: 'a t
* 'a
-> unit
7 val deque
: 'a t
-> 'a option
10 datatype 'a t
= T
of {front
: 'a list ref
, back
: 'a list ref
}
12 fun new () = T
{front
= ref
[], back
= ref
[]}
14 fun enque (T
{back
, ...}, x
) = back
:= x
:: !back
16 fun deque (T
{front
, back
}) =
20 | l
=> let val l
= rev l
22 [] => raise Fail
"deque"
23 | x
:: l
=> (back
:= []; front
:= l
; SOME x
)
25 | x
:: l
=> (front
:= l
; SOME x
)
32 val spawn
: (unit
-> unit
) -> unit
33 val yield
: unit
-> unit
38 open Itimer Signal Thread
40 val topLevel
: Thread
.Runnable
.t option ref
= ref NONE
43 val threads
: Thread
.Runnable
.t Queue
.t
= Queue
.new ()
45 fun ready t
= Queue
.enque (threads
, t
)
47 case Queue
.deque threads
of
48 NONE
=> valOf (!topLevel
)
52 fun 'a
exit (): 'a
= switch (fn _
=> next ())
54 fun new (f
: unit
-> unit
): Thread
.Runnable
.t
=
56 (Thread
.new (fn () => ((f () handle _
=> exit ())
60 fun schedule t
= (ready t
; next ())
62 fun yield (): unit
= switch (fn t
=> schedule (Thread
.prepare (t
, ())))
64 val spawn
= ready
o new
67 Itimer
.set (Itimer
.Real,
73 (topLevel
:= SOME (Thread
.prepare (t
, ()))
74 ; new (fn () => (setHandler (alrm
, Handler
.handler schedule
)
75 ; setItimer (Time
.fromMilliseconds
20)))))
76 ; setItimer Time
.zeroTime
87 | n
=> (delay
500000; loop (n
- 1))
91 | n
=> (Thread
.spawn (fn () => loop n
); loop
' (n
- 1))
93 val _
= Thread
.spawn (fn () => loop
' 10)
97 val _
= print
"success\n"