# $Id: prodcons.pliant,v 1.0 2002/02/25 11:58:00 dada Exp $
# http://dada.perl.it/shootout/
module "/pliant/language/context.pli"
gvar Sem s
gvar Int count := 0
gvar Int data := 0
gvar Int produced := 0
gvar Int consumed := 0
gvar Int done := 0
function consumer n
arg Int n
var Int i
part forever
part consumer_wait
if(count = 0)
restart consumer_wait
leave consumer_wait
i := data
count := 0
# console "consuming " i eol
consumed := consumed + 1
if (i = n)
leave forever
restart forever
function producer n
arg Int n
for (var Int i) 1 n
part producer_wait
if(count = 1)
restart producer_wait
leave producer_wait
data := i
count := 1
# console "producing " i eol
produced := produced + 1
done := 1
gvar Str s_n := cast ((pliant_script_args translate Address 1) map CStr) Str
if (s_n parse (gvar Int n))
thread
# console "starting producer thread..." eol
share produced
share data
share count
share s
share done
producer n
thread
# console "starting consumer thread..." eol
share consumed
share data
share count
share s
consumer n
part wait_done
if (done = 1)
leave wait_done
restart wait_done
console produced " " consumed eol
s release
else
console "usage: prodcons.pliant <number>" eol