#! /bin/sh

# demo.sh sh script
# Demonstration du serveur de semaphore et du client
#  par Joel THIEFFRY (minfg120)

# Envoi d'une commande vers le serveur de semaphore
# Syntaxe: appel_serveur "commande"
appel_serveur ()
{
  $CLIENT $SERVERHOST $SERVERPORT "$1"
  resultat=$?
  if test $resultat -eq 2
  then
    echo "Connexion avec le serveur impossible !"
    exit 1
  fi
  return $resultat
}

# Idem appel_serveur mais toutes les sorties sont cachees
appel_serveur_cache ()
{
  $CLIENT $SERVERHOST $SERVERPORT "$1" 2>/dev/null >/dev/null
  resultat=$?
  if test $resultat -eq 2
  then
    echo "Connexion avec le serveur impossible !"
    exit 1
  fi
  return $resultat
}

# Le client 1
client1 ()
{
  appel_serveur_cache "WAIT 3"
  echo "=Client1 synchronise"

  sleep 3
# T=3
  echo "=Client1 cree un semaphore d'identificateur 1 contenant au depart 1 jeton."
  appel_serveur "CREATE 1"

  sleep 3
# T=6
  echo "=Client1 realise une attente sur le semaphore 1 (le semaphore 1 du serveur passe a 0 jeton)."
  appel_serveur "WAIT 1"
  echo "=Client1 sort de l'attente."

  sleep 15
# T=21
  echo "=Client1 signale le semaphore 1."
  appel_serveur "RELEASE 1"

  sleep 18
# T=33
  echo "=Client1 realise une attente sur le semaphore 2. Le serveur bloque le client puisque le semaphore ne contient plus de jetons."
  appel_serveur "WAIT 2"
  echo "=Client1 sort de l'attente."

  appel_serveur_cache "WAIT 4"
  echo "=Client1 sortie"
}

# Le client 2
client2 ()
{
  appel_serveur_cache "WAIT 3"
  echo "=Client2 synchronise"

  sleep 9
# T=9
  echo "=Client2 essaie de creer un semaphore d'identificateur 1. Le semaphore etant deja cree, un message d'erreur est renvoye par le serveur."
  appel_serveur "CREATE 1"

  sleep 3
# T=12
  echo "=Client2 realise une attente sur le semaphore 1. Le serveur bloque le client puisque le semaphore ne contient plus de jetons."
  appel_serveur "WAIT 1"
  echo "=Client2 sort de l'attente."

  sleep 3
# T=24
  echo "=Client2 signale le semaphore 1."
  appel_serveur "RELEASE 1"

  appel_serveur_cache "WAIT 4"
  echo "=Client2 sortie"
}

# Le client 3
client3 ()
{
  appel_serveur_cache "WAIT 3"
  echo "=Client3 synchronise"

  sleep 15
# T=15
  echo "=Client3 cree un semaphore d'identificateur 2 contenant au depart 1 jeton."
  appel_serveur "CREATE 2"

  sleep 3
# T=18
  echo "=Client3 realise une attente sur le semaphore 1. Le serveur bloque le client puisque le semaphore ne contient plus de jetons."
  appel_serveur "WAIT 1"
  echo "=Client3 sort de l'attente."

  sleep 3
# T=27
  echo "=Client3 signale le semaphore 1 (le semaphore 1 du serveur passe a 1 jeton)."
  appel_serveur "RELEASE 1"

  sleep 3
# T=30
  echo "=Client3 realise une attente sur le semaphore 2 (le semaphore 2 du serveur passe a 0 jeton)."
  appel_serveur "WAIT 2"
  echo "=Client3 sort de l'attente."

  sleep 9
# T=39
  echo "=Client3 signale le semaphore 2."
  appel_serveur "RELEASE 2"

  appel_serveur_cache "WAIT 4"
  echo "=Client3 sortie"
}

# Entete d'introduction
echo "=== Demonstration du serveur de semaphore  et du client==="
echo "                              par Joel THIEFFRY (minfg120)"

# Quelques definitions utiles de variables
EXEEXT='.exe'
DIR=`dirname $0`
CLIENT="$DIR/sem_client$EXEEXT"
if test -f $CLIENT
then
  echo "==Demo: sem_client trouve"
else
  echo "==Demo: sem_client non trouve !"
  exit 1
fi
SERVERHOST=`hostname`
SERVERPORT=`cat $DIR/sem_server.port`
SERVERPID=`cat $DIR/sem_server.pid`
export CLIENT SERVERHOST SERVERPORT

# Reinitialisation du serveur, avec test de la 1ere connexion
appel_serveur_cache "RESET"
echo "==Demo: Serveur trouve"

# Lancement et synchronisation des clients
appel_serveur_cache "CREATE 3"
appel_serveur_cache "CREATE 4"
appel_serveur_cache "WAIT 3"
appel_serveur_cache "WAIT 4"
client1 &
client2 &
client3 &
echo "==Demo: Synchronisation des clients"
sleep 3
# T=0
appel_serveur_cache "RELEASE 3"
appel_serveur_cache "RELEASE 3"
appel_serveur_cache "RELEASE 3"
sleep 3
# T=3
appel_serveur_cache "DESTROY 3"
sleep 39
# T=42
appel_serveur_cache "RELEASE 4"
appel_serveur_cache "RELEASE 4"
appel_serveur_cache "RELEASE 4"
sleep 3
# T=45
appel_serveur_cache "DESTROY 4"
echo "==Demo: Fin"
exit 0
