#!/usr/bin/env perl
use strict;
use warnings;
use English;
use File::Basename;
use Cwd;
my $NOM_PROG = basename $PROGRAM_NAME;

#
#
# les buts de ce script sont :
#   1- creer les pipes nommes pour le dialogue Herezh-Herezh (mkfifo)
#   2- lancer le processus Herezh Umat_HZ.info (qui sert d UMAT pour le vrai calcul Herezh de ce test)
#   3- s assurer que le processus Umat_HZ.info fonctionne avant de quitter
#
#   remarque1 : on lance le processus Herezh Umat_HZ.info via le lien symbolique $lien_symbolique_HZ
#               dont le nom sera facile a reperer pour le script de post-traitement .posttrait
#               (car le script .posttrait aura pour but de tuer ce processus apres le calcul LOI_VIA_UMAT_1.info)
#
#   remarque2 : le processus Herezh Umat_HZ.info est lance dans un processus fils (fork) pour pouvoir le laisser
#               tourner en fond de tache et quitter ce script
#


#chemin absolu vers l executable Herezh
my $hzchemin = shift(@ARGV);

#nom du fichier .info
my $finfo = shift(@ARGV);



#forcer a vider le buffer (autoflush)
$| = 1;



#creation des pipes nommes (mkfifo)
system("mkfifo -m+wr Umat_envoi_Hz");
if($!) {
  print "\nErreur (prog:$NOM_PROG) : probleme dans la creation du pipe nomme Umat_envoi_Hz ($!)...\n\n";
  print "resultat pretrait : ECHEC\n";
  exit;
}
system("mkfifo -m+wr Umat_reception_Hz");
if($!) {
  print "\nErreur (prog:$NOM_PROG) : probleme dans la creation du pipe nomme Umat_reception_Hz ($!)...\n\n";
  print "resultat pretrait : ECHEC\n";
  exit;
}


#changement d extension (suppression de l extension .a_renommer pour faire de ce fichier un .info exploitable)
system("mv -f Umat_HZ.info.a_renommer Umat_HZ.info");


#lien symbolique vers Herezh pour rendre le nom de cette commande unique
#  rq : on utilise le nom du repertoire courant qui est unique et qui sera
#       facile a reperer plus tard dans le script .posttrait (voir script .posttrait)
my $lien_symbolique_HZ = basename $hzchemin;
$_ = basename cwd;
$lien_symbolique_HZ = $_.'_'.$lien_symbolique_HZ;
system("ln -s $hzchemin $lien_symbolique_HZ");


#lancement du processus Herezh Umat dans un processus fils (fork)
#  rq : une fois que le calcul rend la main, il cree le fichier $lien_symbolique_HZ.rendu_la_main qui servira plus tard
system("rm -f $lien_symbolique_HZ.rendu_la_main");
my $pid_UMAT_HZ = fork();
     #
     #le bloc suivant ne concerne que le processus fils
     if($pid_UMAT_HZ == 0) {
       system("$lien_symbolique_HZ -f Umat_HZ.info");
       system("echo 1 > $lien_symbolique_HZ.rendu_la_main");#creation d un fichier pour signaler que le calcul a rendu la main
       exit;
     }


#apres un temps de pause, on regarde si le processus Herezh tourne
select(undef, undef, undef, 0.5);
my $cpt_probleme = 0;
while(join('', qx(ps | grep $lien_symbolique_HZ | grep -v grep)) eq '') {
  select(undef, undef, undef, 0.5);
  $cpt_probleme++;
  if($cpt_probleme == 50) {
    print "\nErreur (prog:$NOM_PROG) : le processus Herezh Umat_HZ.info ne se lance pas (ou alors s est arrete prematurement)...\n\n";
    print "resultat pretrait : ECHEC\n";
    exit;
  }
}


#apres un nouveau temps de pause, on regarde si le fichier $lien_symbolique_HZ.rendu_la_main a ete cree
#  si oui, ca veut dire que le processus Herezh Umat s est arrete => donc il y a un probleme
select(undef, undef, undef, 0.5);
if(-e "$lien_symbolique_HZ.rendu_la_main") {
  print "\nErreur (prog:$NOM_PROG) : le processus Herezh Umat_HZ.info s est peut-etre arrete prematurement...\n\n";
  print "resultat pretrait : ECHEC\n";
  exit;
}



#reussite du script
print "resultat pretrait : OK\n";
