#!/bin/csh

#######################################################################################################################################
#                                                                                                                                     #
#         E X E C U T I O N   D E   L A   P R E M I E R E   C O M M A N D E   D U                                                     #
#         F I C H I E R   A R G U M E N T   E T   S U P P R E S S I O N  :                                                            #
#                                                                                                                                     #
#                                                                                                                                     #
#         Utilisation :                                                                                                               #
#                                                                                                                                     #
#                   $xcs/Linda$vv$Z     <fichier_mode_ro> [<VerrouBlocage> [<TaillePaquets> [<FEnvironnement>]]]                      #
#                                                                                                                                     #
#                                                                                                                                     #
#         Nota :                                                                                                                      #
#                                                                                                                                     #
#                     Le 20121227122556 fut introduite la                                                                             #
#                   variable d'environnement :                                                                                        #
#                                                                                                                                     #
#                                       setenv              TaillePaquetsLinda  (...)                                                 #
#                                       $xcs/Linda$vv$Z     (...)                                                                     #
#                                       unsetenv            TaillePaquetsLinda                                                        #
#                                                                                                                                     #
#                   qui permet donc "de l'exterieur" de forcer                                                                        #
#                   la valeur par defaut de '$TaillePaquets'...                                                                       #
#                                                                                                                                     #
#                                                                                                                                     #
#                     Le 20150205095655 fut introduite la                                                                             #
#                   variable d'environnement :                                                                                        #
#                                                                                                                                     #
#                                       setenv              SLinda              $NEXIST                                               #
#                                       $xcs/Linda$vv$Z     (...)                                                                     #
#                                       unsetenv            SLinda                                                                    #
#                                                                                                                                     #
#                   qui permet donc de ne pas forcer la commande 'S'                                                                  #
#                   definissant un certain nombres d'alias et                                                                         #
#                   de variables utiles.                                                                                              #
#                                                                                                                                     #
#                                                                                                                                     #
#         Author of '$xcs/Linda$vv$Z' :                                                                                               #
#                                                                                                                                     #
#                     Jean-Francois Colonna (LACTAMME, 20090119090300).                                                               #
#                                                                                                                                     #
#######################################################################################################################################

set       Fichier_mode_ro=$1
                                        # ATTENTION : le mode de '$Fichier_mode_ro' doit etre 'ro' mais il est malheureusement        #
                                        # impossible de le verifier puisque plusieurs versions de '$xcs/Linda$vv$Z' peuvent           #
                                        # s'executer simultanement (alors qu'elles font des {rwv,rov}...).                            #
set       VerrouBlocage=$2
                                        # Argument introduit le 20090316102934 qui s'il est present designe un fichier qui permet     #
                                        # de bloquer la commande  courante ('$CoMmAnDe') avant son execution. ATTENTION : evidemment  #
                                        # s'il plusieurs occurences de '$xcs/Linda$vv$Z' il est absolument essentiel que pour eviter  #
                                        # un blocage generalise, il y ait autant de fichiers '$VerrouBlocage's differents qu'il y a   #
                                        # d'occurences de '$xcs/Linda$vv$Z'...                                                        #
set       TaillePaquets=$3
                                        # Argument introduit le 20110523210538 pour 'v $Falias_catalf .xcs.Linda.vv.Z'. En effet,     #
                                        # lorsque les commandes a executer sont breves, voire tres breves (comme c'est le cas en      #
                                        # moyenne pour 'v $Falias_catalf .xcs.Linda.vv.Z'), afin de contrebalancer le "cout" de       #
                                        # la gestion du parallelisme, il est preferable de regrouper ces commandes par paquets...     #
set       FEnvironnement=$4
                                        # Argument introduit le 20110524085419 pour 'v $Falias_catalf .xcs.Linda.vv.Z' et essentiel   #
                                        # dans le cas ou '$Fichier_mode_ro' reference des alias et/ou des variables "specifiques"     #
                                        # (c'est-a-dire ne faisant pas partie de l'environnement...).                                 #

if        ("$TaillePaquets" == "$K_VIDE") then
#20111218093147____:          set       TaillePaquets=1                                                                               #
#20121227122556____:          set       TaillePaquets=1                                                                               #
                                        # Valeur par defaut...                                                                        #

          if        ($?TaillePaquetsLinda == $EXIST) then
                    set       TaillePaquets=$TaillePaquetsLinda
                                        # Valeur par defaut introduite sous cette forme le 20121227122556...                          #
          else
#20191213105854____:                    set       TaillePaquets=1                                                                     #
                                        # Valeur par defaut...                                                                        #

                    if        ($?TaillePaquetsDiviseur == $NEXIST) then
                                        # Test introduit le 20191213134627...                                                         #
#20200307101330____:                              setenv    TaillePaquetsDiviseur         8                                           #
                              setenv    TaillePaquetsDiviseur         4
                                        # On notera le 20191213132147 la valeur arbitraire de '$TaillePaquetsDiviseur'. Plus celle-ci #
                                        # est grande et plus les paquets sont petits. On notera au passage que plus cette valeur est  #
                                        # proche de 1, plus cela fait l'hypothese que la duree d'execution est a peu pres le meme     #
                                        # pour tous les paquets...                                                                    #
                    else
                    endif

                    set       TailleFichier_mode_ro=`$CA $Fichier_mode_ro | $WCl`
                    set       TaillePaquets=`calculINS ($TailleFichier_mode_ro/$ProcessorNumber)/$TaillePaquetsDiviseur`
                    set       TaillePaquets=`$xcg/MAX2.01$X a=1 b=$TaillePaquets signe="$K_VIDE"`
                    unset     TailleFichier_mode_ro
                                        # Introduit le 20191213102418 afin de favoriser l'usage de "paquets" de commandes ce qui      #
                                        # permet, lorsque ces commandes s'executent tres rapidement, de reduire l'"overhead" de       #
                                        # gestion du parallelisme...                                                                  #

#20191213134627____:                    unset     TaillePaquetsDiviseur                                                               #
          endif

          if        (-e $Fichier_mode_ro) then
#20120114112420____:          set       EsT_Ce__Gserveur=`$CA $Fichier_mode_ro | $EGRE -e "^Gserveur |^$xiMo/Gserveur$Z " | $HEA -1`  #
set       EsT_Ce__Gserveur=`$CA $Fichier_mode_ro | $EGRE -e "^ *Gserveur |^ *$xiMo/Gserveur$Z "'|^ *\$xiMo/Gserveur\$Z ' | $HEA -1`

#20120114112420____:          set       EsT_Ce__creation_Z=`$CA $Fichier_mode_ro | $EGRE -e "^$xiMo/recreation$Z " | $HEA -1`         #
set       EsT_Ce__creation_Z=`$CA $Fichier_mode_ro | $EGRE -e "^ *$xiMo/recreation$Z "'|^ *\$xiMo/recreation\$Z ' | $HEA -1`

                    if        (    ("$EsT_Ce__Gserveur" != "$K_VIDE")                                                                   \
                              ||   ("$EsT_Ce__creation_Z" != "$K_VIDE")                                                                 \
                               ) then
#20120509181951____:                              set       TaillePaquets=20                                                          #
#20140525091811____:                              set       TaillePaquets=8                                                           #
                              set       TaillePaquets=1
                                        # Introduit le 20111218093147 afin d'ameliorer le parallelisme de certaines commandes dont    #
                                        # les temps d'execution sont brefs et surtout quasiment constants, ce qui fait que les        #
                                        # differentes branches paralleles ont tendance a se synchroniser et donc se "gener"           #
                                        # mutuellement lors de l'acces au fichier '$Fichier_mode_ro'. On introduit donc ici un        #
                                        # peu d'heuristique...                                                                        #
                                        #                                                                                             #
                                        # On notera le 20120509155437 que pour la generation des petits diaporamas (tel celui qui     #
                                        # est associe a 'v $xiMt/Galerie_Astrophysics$vv.$m4.$I') il n'y aura donc pas d'execution    #
                                        # parallele. Peut-etre faudrait-il diminuer la valeur 20 (10 ou moins ?) ? Le 20120509181951  #
                                        # je passe de 20 a 8 pour voir...                                                             #
                                        #                                                                                             #
                                        # A cause de 'v $xiMt/ComplexiteStructurelle.Recursive.01.$m4.$I' dont le 'Gserveur'          #
                                        # correspondant ('v $xiMd/ComplexiteStructurelle.Recursive.01$m4') est tres long, le          #
                                        # 20140525091811 je reviens a 1 pour voir...                                                  #
                    else
#20121227122357____:                              set       TaillePaquets=1                                                           #
                    endif

                    unset     EsT_Ce__Gserveur
                    unset     EsT_Ce__creation_Z
          else
#20121227122357____:                    set       TaillePaquets=1                                                                     #
                                        # Pas tres utile, mais on ne sait jamais...                                                   #
          endif
else
endif

if        ($?SLinda == $NEXIST) then
#20150205104741____:          setenv    SLinda    $NEXIST                                                                             #
          setenv    SLinda    $EXIST
                                        # Valeur par defaut introduite le 20150205095655...                                           #
else
endif

if        (-e $Fichier_mode_ro) then
#20150205104329____:          if        (         ("$mHOTE" == "$mDev_WWW")                                                        \  #
#20150205104329____:                    ||        ($sHOTE == $sPORTABLE_1)                                                         \  #
#20150205104329____:                    ||        ($sHOTE == $sPORTABLE_2)                                                         \  #
#20150205104329____:                    ||        ($sHOTE == $sPORTABLE_3)                                                         \  #
#20150205104329____:                    ||        ($sHOTE == $sPORTABLE_4)                                                         \  #
#20150205104329____:                    ||        ($sHOTE == $sPORTABLE_5)                                                         \  #
#20150205104329____:                     ) then                                                                                       #
#20150205104329____:                    if        (-e $xiMo/serveur.01$vv$Y) then                                                     #
#20150205104329____:                              set       NoCheckServeur=$EXIST                                                     #
#20150205104329____:                              source    $xiMo/serveur.01$vv$Y                                                     #
#20150205104329____:                              unset     NoCheckServeur                                                            #
                                        # Et ce afin de pouvoir disposer d'alias du type 'Gserveur' sur '$mDev_WWW'.                  #
#20150205104329____:                    else                                                                                          #
#20150205104329____:                    endif                                                                                         #
#20150205104329____:          else                                                                                                    #
#20150205104329____:          endif                                                                                                   #

          if        ($SLinda == $EXIST) then
                    PushdC    $xrC

                    set       No_Sdu=$EXIST
                    S
                    unset     No_Sdu
                                        # L'introduction de 'S' le 20150205095655 a implique la modification du 20150205104329        #
                                        # ci-dessus...                                                                                #

                    PopdC
          else
          endif

          set       BoUcLeR=$EXIST

          while     ($BoUcLeR == $EXIST)
#20090522162205____:                    rwv       $Fichier_mode_ro                                                      >& $nul       #

                    set       rwv_NoMes=$EXIST
                    set       PhasCriB_NoMesUtil=$EXIST
#20110524131848____:                    set       TeMpO_PhasCriB=0.002                                                                #
#20110528101359____:                    set       TeMpO_PhasCriB=0.02                                                                 #
                                        # Aux environs du 20110528101359 j'ai fait des experiences concernant la valeur de            #
                                        # '$TeMpO_PhasCriB'. Contrairement a ce que je croyais naivement, une valeur nulle            #
                                        # n'accelere pas le processus et la valeur '0.02' ('v $Fvariables pTEMPORISATION')            #
                                        # semble etre une bonne valeur. Malgre tout ces experiences ont montre que le "cout" du       #
                                        # parallelisme etait eleve pour 110 '$xcg/fichier_etat$X tout=VRAI' des '$X' de '$xrv' :      #
                                        # si le fichier correspondant est "source", il faut 5 secondes ("a la montre") contre 60      #
                                        # en mode '$xcs/Linda$vv$Z' sur '$LACT18'... La question qui se pose est de savoir ou se      #
                                        # situe le "cout" ci-apres : en fait 40% du temps (dans le cas du test precedent) est         #
                                        # utilise par {rwv,rov}, le 'SourceTmp' de {PhasCriB,PhasCriE} en etant responsable.          #

                    rwv       $Fichier_mode_ro

#20110524131848____:                    unset     TeMpO_PhasCriB                                                                      #
                    unset     PhasCriB_NoMesUtil
                    unset     rwv_NoMes
                                        # Appropriation du fichier '$Fichier_mode_ro'...                                              #
                                        #                                                                                             #
                                        # La modification du 20090522162205 est due au probleme 'v $Falias_PhasCriB 20090522111309'.  #
                                        # Le 20090522163157, fut introduit '$rwv_NoMes' suite a la modification du 20090522162205...  #
                                        #                                                                                             #
                                        # Je note le 20100315101519 que c'est la chaine de commandes :                                #
                                        #                                                                                             #
                                        #                   rwv --> PhasCriB                                                          #
                                        #                                                                                             #
                                        # qui est responsable du 'sleep' d'une duree de '$TEMPORISATION' ou '$pTEMPORISATION'...      #
                                        #                                                                                             #
                                        # On notera que l'on pourrait positionner '$TeMpO_PhasCriB' afin de reduire la duree des      #
                                        # 'sleep's et donc accelerer (peut-etre...) le processus...                                   #

#20110523210853____:                    SIZE      $Fichier_mode_ro                                                                    #
#20110523210853____:                    set       SiZe_Fichier=$Fsize                                                                 #

                    set       SiZe_Fichier_Avant=`$CA $Fichier_mode_ro | $WCl`

                    if        (-e $xcg/MIN2.01$X) then
                                        # Test introduit le 20170403105900 car, en effet, '$xcg/MIN2.01$X' peut etre inexistant de    #
                                        # facon temporaire si justement 'v $xcs/Linda$vv$Z' sert en ce moment a faire des             #
                                        # compilations et que 'v $xcg/MIN2.01$K' est en cours de compilation...                       #
                              set  SiZe_Fichier=`$xcg/MIN2.01$X a=$SiZe_Fichier_Avant b=$TaillePaquets entier=VRAI signe="$K_VIDE"`
                                        # Le 20120713133554 le nom 'SiZe_Fichier' a ete complete par 'SiZe_Fichier_Avant' afin de     #
                                        # pouvoir valider la suppression des premieres lignes via '$SuPpReSs'. En effet, aux environs #
                                        # de cette date, sur '$CMAP28' (ex(1) "grenelle"), lors de l'execution de :                   #
                                        #                                                                                             #
                                        #                   job       $xiMo/ReGENEREAll$Z $EXIST $NEXIST $NEXIST $NEXIST $NEXIST      #
                                        #                                                                                             #
                                        # la page 'v $xiMd/relai_universel.01$vv$m4' a ete generee quasiment simultanement dans deux  #
                                        # branches paralelles. Dorenavant, on verifiera que '$SuPpReSs' a bien detruit des lignes et  #
                                        # qu'ainsi la longueur du fichier '$Fichier_mode_ro' a bien diminue...                        #
                    else
                              EROR      "La commande '"'$xcg/MIN2.01$X'"' n'existe pas."

#20170404033231____:                              set  SiZe_Fichier=$SiZe_Fichier_Avant                                               #

                              if        ($SiZe_Fichier_Avant < $TaillePaquets) then
                                        # Test emulant le '$xcg/MIN2.01$X' introduit le 20170404033231...                             #
                                        set       SiZe_Fichier=$SiZe_Fichier_Avant
                              else
                                        set       SiZe_Fichier=$TaillePaquets
                              endif
                    endif

                    if        ($SiZe_Fichier > 0) then
                              FilSTmpB  CoMmAnDe $Y
                                        # Creation d'un fichier temporaire contenant la commande a executer.                          #

                              $CA       $xcs/csh$Y                                                                                      \
                                                                                                    >> $CoMmAnDe
                                        # Initialisation du fichier temporaire '$CoMmAnDe'...                                         #

                              if        ("$FEnvironnement" != "$K_VIDE") then
                                        if        (-e $FEnvironnement) then
                                                  $CA       $FEnvironnement                                                             \
                                                                                                                        >> $CoMmAnDe
                                        # Possibilite introduite le 20110524085419 permettant donc d'executer dans :                  #
                                        #                                                                                             #
                                        #                   source    $CoMmAnDe                                                       #
                                        #                                                                                             #
                                        # ci-apres des commandes qui sont, par exemple, des alias avec des variables. Ceci est        #
                                        # utilise dans 'v $Falias_catalf .Falias_catalf_1' ou la commande executee est l'alias        #
                                        # 'EdItE'...                                                                                  #
                                        else
                                                  EROR      "Le fichier '"$FEnvironnement"' n'existe pas."
                                        endif
                              else
                              endif

                              $CA       $Fichier_mode_ro                                                                          |     \
                              $HEA      --lines $TaillePaquets                                                                          \
                                                                                                    >> $CoMmAnDe
                                        # Recuperation de l'instruction courante...                                                   #

                              if        ($TaillePaquets > 1) then
                                        FilSTmpB  SuPpReSs $Y
                                        # Creation d'un fichier temporaire contenant la commande de suppression de '$TaillePaquets'   #
                                        # lignes en tete de '$Fichier_mode_ro'...                                                     #

                                        $CA       $xcs/csh$Y                                                                            \
                                                                                                              >> $SuPpReSs
                                        # Initialisation du fichier temporaire '$CoMmAnDe'...                                         #

                                        echo      "$E        $Fichier_mode_ro                       << Fin_Delete       >& $nul"        \
                                                                                                              >> $SuPpReSs
                                        echo      "1,$SiZe_Fichier""d"                                                                  \
                                                                                                              >> $SuPpReSs
                                        echo      "w"                                                                                   \
                                                                                                              >> $SuPpReSs
                                        echo      "q"                                                                                   \
                                                                                                              >> $SuPpReSs
                                        echo      "Fin_Delete"                                                                          \
                                                                                                              >> $SuPpReSs
                                        # Tout ceci est du au fait que l'on ne peut pas parametrer par des variables les lignes       #
                                        # entrees via "<<...". On notera que l'on ne peut ecrire :                                    #
                                        #                                                                                             #
                                        #                   "1,$TaillePaquets""d"                                                     #
                                        #                                                                                             #
                                        # car, en effet, a la fin du processus, dans le cas ou l'on a strictement :                   #
                                        #                                                                                             #
                                        #                   $SiZe_Fichier < $TaillePaquets                                            #
                                        #                                                                                             #
                                        # alors '$E' refuse de detruire les dernieres (toutes...) lignes de '$Fichier_mode_ro'...     #

                                        source    $SuPpReSs
                                        # Suppression de l'instruction courante...                                                    #

                                        FilSTmpE  SuPpReSs
                              else
                                        # Dans le cas ou les paquets contiennent une seule instruction, on optimise (pour une         #
                                        # fois...) en evitant la lourdeur du code ci-dessus...                                        #
                                        $E        $Fichier_mode_ro                                  << Fin_Delete       >& $nul
1d
w
q
Fin_Delete
                                        # Suppression de l'instruction courante...                                                    #
                                        #                                                                                             #
                                        # Afin d'eviter des problemes du type 'v $Fcommandes SYSTEME_FX2800_CONCENTRIX', le           #
                                        # 20090120092015 j'ai essaye de supprimer la premiere ligne de '$Fichier_mode_ro' via :       #
                                        #                                                                                             #
                                        #                   FileTmpB  TeMpOrAiRe                                                      #
                                        #                   $CA       $Fichier_mode_ro                                       |     \  #
                                        #                   $TAI      --lines +2                                                   \  #
                                        #                   >> $TeMpOrAiRe                                                            #
                                        #                   $DELETE   $Fichier_mode_ro                                                #
                                        #                   $MV       $TeMpOrAiRe $Fichier_mode_ro                                    #
                                        #                   FileTmpE  TeMpOrAiRe $NEXIST                                              #
                                        #                                                                                             #
                                        # Malheureusement, cela ne marche pas a cause du '$DELETE   $Fichier_mode_ro' qui fait que    #
                                        # de temps en temps '$Fichier_mode_ro' n'existe pas ce qui "perturbe" d'autres occurences     #
                                        # paralleles de '$xcs/Linda$vv$Z'...                                                          #
                              endif

                              set       SiZe_Fichier_Apres=`$CA $Fichier_mode_ro | $WCl`
                                        # Introduit le 20120713134302 afin de valider l'execution de '$SuPpReSs' ci-dessus...         #

                              if        ($SiZe_Fichier_Apres == $SiZe_Fichier_Avant) then
                                        # Tests introduits le 20120713134302...                                                       #
                                        EROR      "Le fichier '"$Fichier_mode_ro"' n'a pas change de taille."
                              else
                                        if        ($SiZe_Fichier_Apres > $SiZe_Fichier_Avant) then
                                                  EROR      "Le fichier '"$Fichier_mode_ro"' vient de grossir en passant \c"
                                                  ECHO      "de $SiZe_Fichier_Avant a $SiZe_Fichier_Apres octets."
                                        else
                                        endif
                              endif

                              unset     SiZe_Fichier_Apres
                    else
                    endif

                    rov       $Fichier_mode_ro                                            >& $nul
                                        # Liberation du fichier '$Fichier_mode_ro'...                                                 #

                    if        ($SiZe_Fichier > 0) then
#20151022112745____:                              source    $CoMmAnDe                                                                 #
                              (source    $CoMmAnDe)
                                        # Execution de la commande courante (qui n'est donc plus dans le fichier argument).           #
                                        #                                                                                             #
                                        # Le 20090615170127, l'execution de la commande courante a ete placee devant l'eventuel       #
                                        # blocage par verrouillage a cause de 'v $xcg/FindExec.01$Z ListeFichierA' qui permet une     #
                                        # reprise d'un travail sous 'Linda' aborte pendant un 'BloqueP'. Ainsi, si '$xcs/Linda$vv$Z'  #
                                        # est aborte pendant le 'TestP', il est essentiel que la commande courante ait deja ete       #
                                        # executee puisqu'elle a deja ete supprimee de la liste '$Fichier_mode_ro' (dans le cas       #
                                        # contraire -correspondant a la situation anterieure au 20090615170127- cette commande        #
                                        # courante n'etait jamais executee !).                                                        #
                                        #                                                                                             #
                                        # La mise entre parentheses du 'source' le 20151022112745 est destinee a eviter des conflits  #
                                        # entre les variables locales (de '$xcs/Linda$vv$Z') et celles qui seront utiles dans le      #
                                        # fichier '$CoMmAnDe'. Cela s'est vu avec la variable '$CoMmAnDe' dans l'alias 'execXYZ'      #
                                        # lors de la mise au point de l'image 'v $xiirc/LYAP.M3$HauteDef.21'. En effet cette          #
                                        # variable '$CoMmAnDe' apparait aussi ici, ci-dessus...                                       #

                              FilSTmpE  CoMmAnDe

                              if        ("$VerrouBlocage" != "$K_VIDE") then
                                        if        (-e $VerrouBlocage) then
                                                  TestP     $VerrouBlocage
                                        # Introduit le 20090316102934 pour permettre de bloquer la '$CoMmAnDe' courante avant son     #
                                        # execution...                                                                                #
                                        else
                                                  EROR      "Le fichier de blocage '"$VerrouBlocage"' n'existe pas."
                                        endif
                              else
                              endif

#20090615170127____:                              source    $CoMmAnDe                                                                 #
                                        # Execution de la commande courante (qui n'est donc plus dans le fichier argument).           #

#20090615170127____:                              FilSTmpE  CoMmAnDe                                                                  #
                    else
                              set       BoUcLeR=$NEXIST
                                        # On arrete car il n'y a plus rien a faire...                                                 #
                    endif

                    unset     SiZe_Fichier
                    unset     SiZe_Fichier_Avant
          end

          unset     BoUcLeR
else
          EROR      "Le fichier '"$Fichier_mode_ro"' n'existe pas."
endif



Copyright © Jean-François Colonna, 2019-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2019-2021.