All pastes #133682 Raw Edit

Mine

public text v1 · immutable
#133682 ·published 2006-08-16 01:26 UTC
rendered paste body
: off  false swap ! ;
: on   true swap ! ;

: semaphore ( -- semaphore )  align here 0 , ;
: semaphore: ( "name" -- )  semaphore constant ;

: new-semanode ( xt semaphore -- )
  align here  swap dup @ ( link ) , !   true ( status ) ,  ( xt ) , ;

: semanode-status ( semanode -- semanode-sfa )  cell+ ;
: semanode-xt ( semanode -- xt )  2 cells + @ ;
: ?semanode-active ( semanode -- flag )  semanode-status @ ;
: perform-semanode ( semanode -- )  semanode-xt execute ;

: find-semanode ( xt semaphore -- semanode true | false )
  begin @ dup while
    2dup semanode-xt <> while
  repeat  nip true 
  else    2drop false  then ;

: +semaphore ( xt semaphore -- )
  2dup find-semanode if  semanode-status on  2drop  else  new-semanode  then ;

: -semaphore ( xt semaphore -- )  find-semanode if  semanode-status off  then ;

: >semaphore ( semaphore -- )
  dup  begin @ dup while
    dup ?semanode-active if  2dup perform-semanode  then
  repeat  2drop ;


semaphore: test
.( Created semaphore 'test': ) test . cr

.( Sending semaphore...) cr
test >semaphore cr

: A ." A received: " . ;
: B ." B received: " . ;
: C ." C received: " . ;

.( Adding A. )
' A test +semaphore
.( Sending semaphore...) cr
test >semaphore cr

.( Adding B. )
' B test +semaphore
.( Sending semaphore...) cr
test >semaphore cr

.( Adding B again. )
' B test +semaphore
.( Sending semaphore...) cr
test >semaphore cr

.( Adding C. )
' C test +semaphore
.( Sending semaphore...) cr
test >semaphore cr

.( Removing A. )
' A test -semaphore
.( Sending semaphore...) cr
test >semaphore cr

.( Removing A again. )
' A test -semaphore
.( Sending semaphore...) cr
test >semaphore cr

.( Removing C. )
' C test -semaphore
.( Sending semaphore...) cr
test >semaphore cr

.( Removing B again. )
' B test -semaphore
.( Sending semaphore...) cr
test >semaphore cr

.( Done.) cr