2008-02-18 10:08:59 -05:00
|
|
|
! Copyright (C) 2008 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2008-02-18 17:20:18 -05:00
|
|
|
USING: dlists kernel threads math concurrency.conditions
|
2008-11-30 19:28:15 -05:00
|
|
|
continuations accessors summary locals fry ;
|
2008-02-18 06:07:40 -05:00
|
|
|
IN: concurrency.semaphores
|
|
|
|
|
|
|
|
TUPLE: semaphore count threads ;
|
|
|
|
|
2008-08-29 02:00:39 -04:00
|
|
|
ERROR: negative-count-semaphore ;
|
|
|
|
|
|
|
|
M: negative-count-semaphore summary
|
|
|
|
drop "Cannot have semaphore with negative count" ;
|
|
|
|
|
2008-02-18 17:20:18 -05:00
|
|
|
: <semaphore> ( n -- semaphore )
|
2008-08-29 02:00:39 -04:00
|
|
|
dup 0 < [ negative-count-semaphore ] when
|
2008-04-13 16:06:27 -04:00
|
|
|
<dlist> semaphore boa ;
|
2008-02-18 06:07:40 -05:00
|
|
|
|
2008-02-18 17:20:18 -05:00
|
|
|
: wait-to-acquire ( semaphore timeout -- )
|
2008-08-29 02:00:39 -04:00
|
|
|
[ threads>> ] dip "semaphore" wait ;
|
2008-02-18 06:07:40 -05:00
|
|
|
|
2008-02-22 00:47:06 -05:00
|
|
|
: acquire-timeout ( semaphore timeout -- )
|
2008-08-29 02:00:39 -04:00
|
|
|
over count>> zero?
|
2008-02-22 00:47:06 -05:00
|
|
|
[ dupd wait-to-acquire ] [ drop ] if
|
2008-08-29 02:00:39 -04:00
|
|
|
[ 1- ] change-count drop ;
|
2008-02-22 00:47:06 -05:00
|
|
|
|
|
|
|
: acquire ( semaphore -- )
|
|
|
|
f acquire-timeout ;
|
2008-02-18 06:07:40 -05:00
|
|
|
|
|
|
|
: release ( semaphore -- )
|
2008-08-29 02:00:39 -04:00
|
|
|
[ 1+ ] change-count
|
|
|
|
threads>> notify-1 ;
|
2008-02-18 17:20:18 -05:00
|
|
|
|
2008-11-30 19:28:15 -05:00
|
|
|
:: with-semaphore-timeout ( semaphore timeout quot -- )
|
|
|
|
semaphore timeout acquire-timeout
|
|
|
|
quot [ semaphore release ] [ ] cleanup ; inline
|
2008-02-22 00:47:06 -05:00
|
|
|
|
2008-02-18 17:20:18 -05:00
|
|
|
: with-semaphore ( semaphore quot -- )
|
2008-11-30 19:28:15 -05:00
|
|
|
swap dup acquire '[ _ release ] [ ] cleanup ; inline
|