2005-01-14 12:01:48 -05:00
|
|
|
! Copyright (C) 2004, 2005 Slava Pestov.
|
2005-02-07 18:27:55 -05:00
|
|
|
! Copyright (C) 2005 Mackenzie Straight.
|
2005-01-29 14:18:28 -05:00
|
|
|
! See http://factor.sf.net/license.txt for BSD license.
|
2004-08-20 21:26:25 -04:00
|
|
|
IN: threads
|
2005-08-23 15:50:32 -04:00
|
|
|
USING: errors hashtables io-internals kernel lists math
|
|
|
|
namespaces queues sequences vectors ;
|
2004-08-20 21:26:25 -04:00
|
|
|
|
2005-08-23 15:50:32 -04:00
|
|
|
! Co-operative multitasker.
|
|
|
|
|
|
|
|
: run-queue ( -- queue ) \ run-queue global hash ;
|
|
|
|
|
|
|
|
: schedule-thread ( quot -- ) run-queue enque ;
|
|
|
|
|
|
|
|
: sleep-queue ( -- vec ) \ sleep-queue global hash ;
|
|
|
|
|
|
|
|
: sleep-queue* ( -- vec )
|
|
|
|
sleep-queue dup [ 2car swap - ] nsort ;
|
|
|
|
|
|
|
|
: sleep-time ( sorted-queue -- ms )
|
|
|
|
dup empty? [ drop -1 ] [ peek car millis - 0 max ] ifte ;
|
|
|
|
|
|
|
|
DEFER: next-thread
|
|
|
|
|
|
|
|
: do-sleep ( -- quot )
|
|
|
|
sleep-queue* dup sleep-time dup 0 =
|
2005-08-23 17:08:38 -04:00
|
|
|
[ drop pop ] [ nip io-multiplex next-thread ] ifte ;
|
2005-02-07 18:04:49 -05:00
|
|
|
|
2004-08-20 21:26:25 -04:00
|
|
|
: next-thread ( -- quot )
|
2005-08-23 15:50:32 -04:00
|
|
|
run-queue dup queue-empty? [ drop do-sleep ] [ deque ] ifte ;
|
|
|
|
|
|
|
|
: stop ( -- ) next-thread call ;
|
|
|
|
|
|
|
|
: yield ( -- ) [ schedule-thread stop ] callcc0 ;
|
|
|
|
|
|
|
|
: sleep ( ms -- )
|
|
|
|
millis + [ cons sleep-queue push stop ] callcc0 drop ;
|
|
|
|
|
|
|
|
: in-thread ( quot -- )
|
|
|
|
[
|
|
|
|
schedule-thread
|
|
|
|
[ ] set-catchstack { } set-callstack
|
|
|
|
try stop
|
|
|
|
] callcc0 drop ;
|
|
|
|
|
|
|
|
: init-threads ( -- )
|
|
|
|
global [
|
|
|
|
<queue> \ run-queue set
|
|
|
|
10 <vector> \ sleep-queue set
|
|
|
|
] bind ;
|