#! /bin/bash

N=2

function assegna(){
    echo $2 >> $1
}

function leggi(){
    tail -1 $1
}


for j in $(seq 1 $N); do
    echo "0">choosing$j
    echo "0">number$j
done
echo "1">alternanza

function max(){
    local m=$(leggi number1)
    for j in $(seq 1 $N); do
	m=$(( $m > $(leggi number$j) ? $m : $(leggi number$j) ))
    done
    echo $m
}


function p(){
    local p
    for p in $(seq $(( $1 * 10 )) $(( $1 * 10 + 9 )) ); do
	while true; do
	    # doorway
	    assegna choosing$1 "1"
	    assegna number$1 "$(( 1 + max ))"
	    # bakery
	    assegna choosing$1 "0"
	    local j
	    for j in $(seq 1 $N); do
		while [ $(leggi choosing$j) -ne 0  ]; do
		    sleep 0.01
		done
		while [ \( $(leggi number$j) -ne 0 \) -a  \
		    \( \( $(leggi number$j) -lt $(leggi number$1) \) -o \
		       \( $(leggi number$j) -eq $(leggi number$1)  \) -a \
		         \( $j -lt $1 \) \) ]; do
		    sleep 0.01
		done
	    done
            # critical section
	    if [ $(leggi alternanza) -eq $1 ]; then
		echo $p
		assegna alternanza "$(( ( $(leggi alternanza) % 2 )  + 1))"
		assegna number$1 "0"
		break
	    else
		assegna number$1 "0"
	    fi
	    # non critical section
	done
    done
}

p 1 & 
p 2 & 

wait %1 %2
