File:  [local] / rpl / src / gestion_processus.c
Revision 1.100: download - view: text, annotated - select for diffs - revision graph
Fri Jan 10 11:15:43 2020 UTC (4 years, 3 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_32, HEAD
Modification du copyright.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.1.32
    4:   Copyright (C) 1989-2020 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #include "rpl-conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   Fonction de surveillance d'un processus fils.
   29:   Elle tourne dans un thread séparé et ferme les descripteurs lors
   30:   de la mort du fils.
   31: ================================================================================
   32:   Entrées : pointeur sur une structure
   33: --------------------------------------------------------------------------------
   34:   Sorties :
   35: --------------------------------------------------------------------------------
   36:   Effets de bord : néant
   37: ================================================================================
   38: */
   39: 
   40: void *
   41: surveillance_processus(void *argument)
   42: {
   43:     int                             status;
   44: 
   45:     integer8                        nombre_donnees;
   46: 
   47:     logical1                        drapeau;
   48:     logical1                        drapeau_fin;
   49:     logical1                        drapeau_fin_scrutation;
   50:     logical1                        drapeau_elements_traites;
   51: 
   52:     pid_t                           pid;
   53:     pid_t                           pid_erreur;
   54: 
   55:     ssize_t                         iostat;
   56:     ssize_t                         longueur_ecriture;
   57: 
   58:     struct_descripteur_thread       *s_argument_thread;
   59: 
   60:     struct_liste_chainee            *l_element_courant;
   61:     struct_liste_chainee            *l_element_precedent;
   62: 
   63:     struct_processus                *s_etat_processus;
   64: 
   65:     struct timespec                 attente;
   66: 
   67:     unsigned char                   caractere;
   68: 
   69:     int                             tampon_erreur_execution;
   70:     int                             tampon_erreur_systeme;
   71: 
   72:     sigset_t                        set;
   73: 
   74:     sigfillset(&set);
   75:     pthread_sigmask(SIG_BLOCK, &set, NULL);
   76: 
   77:     s_argument_thread = argument;
   78:     s_etat_processus = (*s_argument_thread).s_etat_processus;
   79: 
   80:     if (pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus)) != 0)
   81:     {
   82:         (*s_etat_processus).erreur_systeme = d_es_processus;
   83:         BUG(1, uprintf("General mutex error!\n"));
   84:     }
   85: 
   86:     nombre_threads_surveillance_processus++;
   87: 
   88:     if (pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)) != 0)
   89:     {
   90:         (*s_etat_processus).erreur_systeme = d_es_processus;
   91:         BUG(1, uprintf("General mutex error!\n"));
   92:     }
   93: 
   94:     insertion_thread_surveillance(s_etat_processus, s_argument_thread);
   95: 
   96:     attente.tv_sec = 0;
   97:     attente.tv_nsec = GRANULARITE_us * 1000;
   98: 
   99:     status = 0;
  100: 
  101:     drapeau_elements_traites = d_faux;
  102: 
  103:     if ((*s_etat_processus).debug == d_vrai)
  104:         if (((*s_etat_processus).type_debug &
  105:                 d_debug_processus) != 0)
  106:     {
  107:         if ((*s_argument_thread).processus_detache == d_vrai)
  108:         {
  109:             if ((*s_etat_processus).langue == 'F')
  110:             {
  111:                 printf("[%d] Lancement du thread de surveillance du"
  112:                         " processus %d\n", (int) getpid(),
  113:                         (int) (*s_argument_thread).pid);
  114:             }
  115:             else
  116:             {
  117:                 printf("[%d] Start monitoring of process %d\n", (int) getpid(),
  118:                         (int) (*s_argument_thread).pid);
  119:             }
  120:         }
  121:         else
  122:         {
  123:             if ((*s_etat_processus).langue == 'F')
  124:             {
  125:                 printf("[%d] Lancement du thread de surveillance du"
  126:                         " thread %llu\n", (int) getpid(), (unsigned long long)
  127:                         (*s_argument_thread).tid);
  128:             }
  129:             else
  130:             {
  131:                 printf("[%d] Start monitoring of thread %llu\n",
  132:                         (int) getpid(), (unsigned long long)
  133:                         (*s_argument_thread).tid);
  134:             }
  135:         }
  136: 
  137:         fflush(stdout);
  138:     }
  139: 
  140:     /*
  141:      * On attend une donnée fictive pour être sûr que le processus fils
  142:      * est bien démarré.
  143:      */
  144: 
  145:     while(read_atomic(s_etat_processus,
  146:             (*s_argument_thread).pipe_nombre_elements_attente[0],
  147:             &caractere, sizeof(caractere)) == 0)
  148:     {
  149:         if ((*s_etat_processus).var_volatile_requete_arret != 0)
  150:         {
  151:             drapeau_elements_traites = d_vrai;
  152:         }
  153: 
  154:         nanosleep(&attente, NULL);
  155:     }
  156: 
  157:     do
  158:     {
  159:         if ((*s_argument_thread).processus_detache == d_vrai)
  160:         {
  161:             /*
  162:              * Le processus est un processus détaché.
  163:              */
  164: 
  165:             if (drapeau_elements_traites == d_vrai)
  166:             {
  167:                 nanosleep(&attente, NULL);
  168:             }
  169:             else if ((iostat = read_atomic(s_etat_processus,
  170:                     (*s_argument_thread).pipe_nombre_elements_attente[0],
  171:                     &caractere, sizeof(caractere))) == 0)
  172:             {
  173:                 // Rien dans le pipe
  174:                 nanosleep(&attente, NULL);
  175:             }
  176:             else if (iostat == sizeof(caractere))
  177:             {
  178:                 // Un objet supplémentaire est dans le pipe correspondant
  179:                 // au processus surveillé par ce thread.
  180: 
  181:                 if (pthread_mutex_lock(&((*s_etat_processus)
  182:                         .mutex_pile_processus)) != 0)
  183:                 {
  184:                     (*s_etat_processus).erreur_systeme_processus_fils =
  185:                             d_es_processus;
  186:                 }
  187: 
  188:                 l_element_courant = (struct_liste_chainee *)
  189:                         (*s_etat_processus).l_base_pile_processus;
  190: 
  191:                 while(l_element_courant != NULL)
  192:                 {
  193:                     if ((*(*((struct_processus_fils *)
  194:                             (*(*l_element_courant).donnee).objet))
  195:                             .thread).processus_detache == d_faux)
  196:                     {
  197:                         l_element_courant = (*l_element_courant)
  198:                                 .suivant;
  199:                         continue;
  200:                     }
  201: 
  202:                     if ((*(*((struct_processus_fils *)
  203:                             (*(*l_element_courant).donnee).objet))
  204:                             .thread).pid == (*s_argument_thread).pid)
  205:                     {
  206:                         break;
  207:                     }
  208: 
  209:                     l_element_courant = (*l_element_courant).suivant;
  210:                 }
  211: 
  212:                 BUG(l_element_courant == NULL,
  213:                         printf("Process or thread not found"));
  214: 
  215:                 switch(caractere)
  216:                 {
  217:                     case 1:
  218:                     case 2:
  219:                     {
  220:                         if ((*s_etat_processus).debug == d_vrai)
  221:                             if (((*s_etat_processus).type_debug &
  222:                                     d_debug_processus) != 0)
  223:                         {
  224:                             if ((*s_etat_processus).langue == 'F')
  225:                             {
  226:                                 if (caractere == 1)
  227:                                 {
  228:                                     printf("[%d] Données en provenance "
  229:                                             "du processus %d\n", (int) getpid(),
  230:                                             (int) (*s_argument_thread).pid);
  231:                                 }
  232:                                 else
  233:                                 {
  234:                                     printf("[%d] Interrution logicielle "
  235:                                             "en provenance du processus "
  236:                                             "%d\n", (int) getpid(),
  237:                                             (int) (*s_argument_thread).pid);
  238:                                 }
  239: 
  240:                                 fflush(stdout);
  241:                             }
  242:                             else
  243:                             {
  244:                                 if (caractere == 1)
  245:                                 {
  246:                                     printf("[%d] Data from process %d\n",
  247:                                             (int) getpid(),
  248:                                             (int) (*s_argument_thread).pid);
  249:                                 }
  250:                                 else
  251:                                 {
  252:                                     printf("[%d] Software interrupt "
  253:                                             "from process %d\n", (int) getpid(),
  254:                                             (int) (*s_argument_thread).pid);
  255:                                 }
  256: 
  257:                                 fflush(stdout);
  258:                             }
  259:                         }
  260: 
  261:                         if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
  262:                                 (*(*l_element_courant).donnee).objet))
  263:                                 .thread).mutex)) != 0)
  264:                         {
  265:                             (*s_etat_processus).erreur_systeme =
  266:                                     d_es_processus;
  267:                         }
  268: 
  269:                         if (caractere == 1)
  270:                         {
  271:                             (*(*((struct_processus_fils *)
  272:                                     (*(*l_element_courant).donnee).objet))
  273:                                     .thread).nombre_objets_dans_pipe++;
  274:                         }
  275:                         else
  276:                         {
  277:                             (*(*((struct_processus_fils *)
  278:                                     (*(*l_element_courant).donnee).objet))
  279:                                     .thread).nombre_interruptions_dans_pipe++;
  280: 
  281:                             if (pthread_mutex_lock(&((*s_etat_processus)
  282:                                     .mutex_interruptions)) != 0)
  283:                             {
  284:                                 (*s_etat_processus).erreur_systeme =
  285:                                         d_es_processus;
  286:                             }
  287: 
  288:                             (*s_etat_processus)
  289:                                     .nombre_interruptions_non_affectees++;
  290: 
  291:                             if (pthread_mutex_unlock(&((*s_etat_processus)
  292:                                     .mutex_interruptions)) != 0)
  293:                             {
  294:                                 (*s_etat_processus).erreur_systeme =
  295:                                         d_es_processus;
  296:                             }
  297:                         }
  298: 
  299:                         if (pthread_mutex_unlock(
  300:                                 &((*(*((struct_processus_fils *)
  301:                                 (*(*l_element_courant).donnee).objet))
  302:                                 .thread).mutex)) != 0)
  303:                         {
  304:                             (*s_etat_processus).erreur_systeme =
  305:                                     d_es_processus;
  306:                         }
  307: 
  308:                         while((longueur_ecriture =
  309:                                 write_atomic(s_etat_processus,
  310:                                 (*(*((struct_processus_fils *)
  311:                                 (*(*l_element_courant).donnee).objet))
  312:                                 .thread).pipe_acquittement[1], "-",
  313:                                 sizeof(unsigned char))) !=
  314:                                 sizeof(unsigned char))
  315:                         {
  316:                             if (longueur_ecriture == -1)
  317:                             {
  318:                                 (*s_etat_processus)
  319:                                         .erreur_systeme_processus_fils =
  320:                                         d_es_processus;
  321:                             }
  322:                         }
  323: 
  324:                         if ((*s_etat_processus).debug == d_vrai)
  325:                             if (((*s_etat_processus).type_debug &
  326:                                     d_debug_processus) != 0)
  327:                         {
  328:                             if ((*s_etat_processus).langue == 'F')
  329:                             {
  330:                                 if (caractere == 1)
  331:                                 {
  332:                                     printf("[%d] Données acquittées "
  333:                                             "en provenance du "
  334:                                             "processus %d\n", (int) getpid(),
  335:                                             (int) (*s_argument_thread).pid);
  336:                                 }
  337:                                 else
  338:                                 {
  339:                                     printf("[%d] Interruption logicielle "
  340:                                             "acquittée en provenance "
  341:                                             "du processus %d\n", (int) getpid(),
  342:                                             (int) (*s_argument_thread).pid);
  343:                                 }
  344: 
  345:                                 fflush(stdout);
  346:                             }
  347:                             else
  348:                             {
  349:                                 if (caractere == 1)
  350:                                 {
  351:                                     printf("[%d] Data acknowklegment "
  352:                                             "from process %d\n", (int) getpid(),
  353:                                             (int) (*s_argument_thread).pid);
  354:                                 }
  355:                                 else
  356:                                 {
  357:                                     printf("[%d] Software interrupt "
  358:                                             "acknowklegment from "
  359:                                             "process %d\n", (int) getpid(),
  360:                                             (int) (*s_argument_thread).pid);
  361:                                 }
  362: 
  363:                                 fflush(stdout);
  364:                             }
  365:                         }
  366: 
  367:                         envoi_signal_thread(NULL,
  368:                                 (*s_argument_thread).thread_pere,
  369:                                 rpl_siginject);
  370:                         break;
  371:                     }
  372: 
  373:                     case 0:
  374:                     {
  375:                         break;
  376:                     }
  377: 
  378:                     default:
  379:                     {
  380:                         (*s_etat_processus).erreur_systeme_processus_fils =
  381:                                 d_es_processus;
  382:                         BUG(1, printf("Spurious interprocess data"));
  383:                     }
  384:                 }
  385: 
  386:                 if (pthread_mutex_unlock(&((*s_etat_processus)
  387:                         .mutex_pile_processus)) != 0)
  388:                 {
  389:                     (*s_etat_processus).erreur_systeme_processus_fils =
  390:                             d_es_processus;
  391:                 }
  392:             }
  393:             else
  394:             {
  395:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  396:             }
  397: 
  398:             if ((pid = waitpid((*s_argument_thread).pid, &status, WNOHANG)) < 0)
  399:             {
  400:                 break;
  401:             }
  402: 
  403:             drapeau_fin_scrutation = (!WIFEXITED(status)) ||
  404:                     (!WIFSIGNALED(status)) || (pid == 0);
  405: 
  406:             if (WIFEXITED(status))
  407:             {
  408:                 if (WEXITSTATUS(status) == (0xFF & EXIT_FAILURE))
  409:                 {
  410:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  411:                 }
  412:             }
  413:         }
  414:         else
  415:         {
  416:             /*
  417:              * Le processus n'est pas détaché.
  418:              */
  419: 
  420:             if (drapeau_elements_traites == d_vrai)
  421:             {
  422:                 nanosleep(&attente, NULL);
  423:             }
  424:             else if ((iostat = read_atomic(s_etat_processus,
  425:                     (*s_argument_thread).pipe_nombre_elements_attente[0],
  426:                     &caractere, sizeof(caractere))) == 0)
  427:             {
  428:                 // Rien dans le pipe
  429:                 nanosleep(&attente, NULL);
  430:             }
  431:             else if (iostat == sizeof(caractere))
  432:             {
  433:                 // Un objet supplémentaire est dans le pipe correspondant
  434:                 // au processus surveillé par ce thread.
  435: 
  436:                 if (pthread_mutex_lock(&((*s_etat_processus)
  437:                         .mutex_pile_processus)) != 0)
  438:                 {
  439:                     (*s_etat_processus).erreur_systeme_processus_fils =
  440:                             d_es_processus;
  441:                 }
  442: 
  443:                 l_element_courant = (struct_liste_chainee *)
  444:                         (*s_etat_processus).l_base_pile_processus;
  445: 
  446:                 while(l_element_courant != NULL)
  447:                 {
  448:                     if ((*(*((struct_processus_fils *)
  449:                             (*(*l_element_courant).donnee).objet))
  450:                             .thread).processus_detache == d_vrai)
  451:                     {
  452:                         l_element_courant = (*l_element_courant).suivant;
  453:                         continue;
  454:                     }
  455: 
  456:                     if ((*(*((struct_processus_fils *)
  457:                             (*(*l_element_courant).donnee).objet))
  458:                             .thread).tid == (*s_argument_thread).tid)
  459:                     {
  460:                         break;
  461:                     }
  462: 
  463:                     l_element_courant = (*l_element_courant).suivant;
  464:                 }
  465: 
  466:                 BUG(l_element_courant == NULL,
  467:                         printf("Process or thread not found"));
  468: 
  469:                 switch(caractere)
  470:                 {
  471:                     case 1:
  472:                     case 2:
  473:                     {
  474:                         if ((*s_etat_processus).debug == d_vrai)
  475:                             if (((*s_etat_processus).type_debug &
  476:                                     d_debug_processus) != 0)
  477:                         {
  478:                             if ((*s_etat_processus).langue == 'F')
  479:                             {
  480:                                 if (caractere == 1)
  481:                                 {
  482:                                     printf("[%d] Données en provenance "
  483:                                             "du thread %llu\n", (int) getpid(),
  484:                                             (unsigned long long)
  485:                                             (*s_argument_thread).tid);
  486:                                 }
  487:                                 else
  488:                                 {
  489:                                     printf("[%d] Interrution logicielle "
  490:                                             "en provenance du thread "
  491:                                             "%llu\n", (int) getpid(),
  492:                                             (unsigned long long)
  493:                                             (*s_argument_thread).tid);
  494:                                 }
  495: 
  496:                                 fflush(stdout);
  497:                             }
  498:                             else
  499:                             {
  500:                                 if (caractere == 1)
  501:                                 {
  502:                                     printf("[%d] Data from thread %llu\n",
  503:                                             (int) getpid(), (unsigned long long)
  504:                                             (*s_argument_thread).tid);
  505:                                 }
  506:                                 else
  507:                                 {
  508:                                     printf("[%d] Software interrupt "
  509:                                             "from thread %llu\n",
  510:                                             (int) getpid(), (unsigned long long)
  511:                                             (*s_argument_thread).tid);
  512:                                 }
  513: 
  514:                                 fflush(stdout);
  515:                             }
  516:                         }
  517: 
  518:                         if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
  519:                                 (*(*l_element_courant).donnee).objet))
  520:                                 .thread).mutex)) != 0)
  521:                         {
  522:                             (*s_etat_processus).erreur_systeme =
  523:                                     d_es_processus;
  524:                         }
  525: 
  526:                         if (caractere == 1)
  527:                         {
  528:                             (*(*((struct_processus_fils *)
  529:                                     (*(*l_element_courant).donnee).objet))
  530:                                     .thread).nombre_objets_dans_pipe++;
  531:                         }
  532:                         else
  533:                         {
  534:                             (*(*((struct_processus_fils *)
  535:                                     (*(*l_element_courant).donnee).objet))
  536:                                     .thread).nombre_interruptions_dans_pipe++;
  537: 
  538:                             if (pthread_mutex_lock(&((*s_etat_processus)
  539:                                     .mutex_interruptions)) != 0)
  540:                             {
  541:                                 (*s_etat_processus).erreur_systeme =
  542:                                         d_es_processus;
  543:                             }
  544: 
  545:                             (*s_etat_processus)
  546:                                     .nombre_interruptions_non_affectees++;
  547: 
  548:                             if (pthread_mutex_unlock(&((*s_etat_processus)
  549:                                     .mutex_interruptions)) != 0)
  550:                             {
  551:                                 (*s_etat_processus).erreur_systeme =
  552:                                         d_es_processus;
  553:                             }
  554:                         }
  555: 
  556:                         if (pthread_mutex_unlock(
  557:                                 &((*(*((struct_processus_fils *)
  558:                                 (*(*l_element_courant).donnee).objet))
  559:                                 .thread).mutex)) != 0)
  560:                         {
  561:                             (*s_etat_processus).erreur_systeme =
  562:                                     d_es_processus;
  563:                         }
  564: 
  565:                         while((longueur_ecriture =
  566:                                 write_atomic(s_etat_processus,
  567:                                 (*(*((struct_processus_fils *)
  568:                                 (*(*l_element_courant).donnee).objet))
  569:                                 .thread).pipe_acquittement[1], "-",
  570:                                 sizeof(unsigned char))) !=
  571:                                 sizeof(unsigned char))
  572:                         {
  573:                             if (longueur_ecriture == -1)
  574:                             {
  575:                                 (*s_etat_processus)
  576:                                         .erreur_systeme_processus_fils =
  577:                                         d_es_processus;
  578:                             }
  579:                         }
  580: 
  581:                         if ((*s_etat_processus).debug == d_vrai)
  582:                             if (((*s_etat_processus).type_debug &
  583:                                     d_debug_processus) != 0)
  584:                         {
  585:                             if ((*s_etat_processus).langue == 'F')
  586:                             {
  587:                                 if (caractere == 1)
  588:                                 {
  589:                                     printf("[%d] Données acquittées "
  590:                                             "en provenance du "
  591:                                             "thread %llu\n", (int) getpid(),
  592:                                             (unsigned long long)
  593:                                             (*s_argument_thread).tid);
  594:                                 }
  595:                                 else
  596:                                 {
  597:                                     printf("[%d] Interruption logicielle "
  598:                                             "acquittée en provenance "
  599:                                             "du thread %llu\n", (int) getpid(),
  600:                                             (unsigned long long)
  601:                                             (*s_argument_thread).tid);
  602:                                 }
  603: 
  604:                                 fflush(stdout);
  605:                             }
  606:                             else
  607:                             {
  608:                                 if (caractere == 1)
  609:                                 {
  610:                                     printf("[%d] Data acknowklegment "
  611:                                             "from thread %d\n", (int) getpid(),
  612:                                             (unsigned long long)
  613:                                             (*s_argument_thread).tid);
  614:                                 }
  615:                                 else
  616:                                 {
  617:                                     printf("[%d] Software interrupt "
  618:                                             "acknowklegment from "
  619:                                             "thread %d\n", (int) getpid(),
  620:                                             (unsigned long long)
  621:                                             (*s_argument_thread).tid);
  622:                                 }
  623: 
  624:                                 fflush(stdout);
  625:                             }
  626:                         }
  627: 
  628:                         if (pthread_mutex_unlock(&((*s_etat_processus)
  629:                                 .mutex_pile_processus)) != 0)
  630:                         {
  631:                             (*s_etat_processus).erreur_systeme_processus_fils =
  632:                                     d_es_processus;
  633:                         }
  634: 
  635:                         envoi_signal_thread(NULL,
  636:                                 (*s_argument_thread).thread_pere,
  637:                                 rpl_siginject);
  638: 
  639:                         if (pthread_mutex_lock(&((*s_etat_processus)
  640:                                 .mutex_pile_processus)) != 0)
  641:                         {
  642:                             (*s_etat_processus).erreur_systeme_processus_fils =
  643:                                     d_es_processus;
  644:                         }
  645: 
  646:                         break;
  647:                     }
  648: 
  649:                     case 0:
  650:                     {
  651:                         break;
  652:                     }
  653: 
  654:                     default:
  655:                     {
  656:                         (*s_etat_processus).erreur_systeme_processus_fils =
  657:                                 d_es_processus;
  658:                         BUG(1, printf("Spurious interprocess data"));
  659:                     }
  660:                 }
  661: 
  662:                 if (pthread_mutex_unlock(&((*s_etat_processus)
  663:                         .mutex_pile_processus)) != 0)
  664:                 {
  665:                     (*s_etat_processus).erreur_systeme_processus_fils =
  666:                             d_es_processus;
  667:                 }
  668:             }
  669:             else
  670:             {
  671:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  672:             }
  673: 
  674:             if (pthread_mutex_lock(&((*s_argument_thread).mutex)) != 0)
  675:             {
  676:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  677:             }
  678: 
  679:             if ((*s_argument_thread).thread_actif == d_faux)
  680:             {
  681:                 if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0)
  682:                 {
  683:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  684:                 }
  685: 
  686:                 pthread_join((*s_argument_thread).tid, NULL);
  687:                 drapeau_fin_scrutation = (0 != 0);
  688:             }
  689:             else
  690:             {
  691:                 if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0)
  692:                 {
  693:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  694:                 }
  695: 
  696:                 drapeau_fin_scrutation = (0 == 0);
  697:             }
  698:         }
  699:     } while(drapeau_fin_scrutation);
  700: 
  701:     /*
  702:      * Le processus fils est terminé. On s'assure qu'il ne
  703:      * reste plus rien dans les tuyaux...
  704:      */
  705: 
  706:     if (pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus)) != 0)
  707:     {
  708:         (*s_etat_processus).erreur_systeme_processus_fils =
  709:                 d_es_processus;
  710:     }
  711:     else
  712:     {
  713:         if ((*s_etat_processus).debug == d_vrai)
  714:             if (((*s_etat_processus).type_debug &
  715:                     d_debug_processus) != 0)
  716:         {
  717:             if ((*s_argument_thread).processus_detache == d_vrai)
  718:             {
  719:                 if ((*s_etat_processus).langue == 'F')
  720:                 {
  721:                     printf("[%d] Surveillance des tuyaux du processus %d\n",
  722:                             (int) getpid(), (int) (*s_argument_thread).pid);
  723:                     fflush(stdout);
  724:                 }
  725:                 else
  726:                 {
  727:                     printf("[%d] Check remaining pipes of process %d\n",
  728:                             (int) getpid(), (int) (*s_argument_thread).pid);
  729:                     fflush(stdout);
  730:                 }
  731:             }
  732:             else
  733:             {
  734:                 if ((*s_etat_processus).langue == 'F')
  735:                 {
  736:                     printf("[%d] Surveillance des tuyaux du thread %llu\n",
  737:                             (int) getpid(), (unsigned long long)
  738:                             (*s_argument_thread).tid);
  739:                     fflush(stdout);
  740:                 }
  741:                 else
  742:                 {
  743:                     printf("[%d] Check remaining pipes of thread %llu\n",
  744:                             (int) getpid(), (unsigned long long)
  745:                             (*s_argument_thread).tid);
  746:                     fflush(stdout);
  747:                 }
  748:             }
  749:         }
  750: 
  751:         l_element_courant = (struct_liste_chainee *)
  752:                 (*s_etat_processus).l_base_pile_processus;
  753: 
  754:         if (drapeau_elements_traites == d_faux)
  755:         {
  756:             while(l_element_courant != NULL)
  757:             {
  758:                 if ((*(*((struct_processus_fils *) (*(*l_element_courant)
  759:                         .donnee).objet)).thread).processus_detache
  760:                         == d_vrai)
  761:                 {
  762:                     if ((*(*((struct_processus_fils *) (*(*l_element_courant)
  763:                             .donnee).objet)).thread).pid ==
  764:                             (*s_argument_thread).pid)
  765:                     {
  766:                         while(read_atomic(s_etat_processus, (*s_argument_thread)
  767:                                 .pipe_nombre_elements_attente[0],
  768:                                 &caractere, sizeof(caractere)) ==
  769:                                 sizeof(caractere))
  770:                         {
  771:                             if (caractere == 0)
  772:                             {
  773:                                 continue;
  774:                             }
  775: 
  776:                             if ((*s_etat_processus).debug == d_vrai)
  777:                                 if (((*s_etat_processus).type_debug &
  778:                                         d_debug_processus) != 0)
  779:                             {
  780:                                 if ((*s_etat_processus).langue == 'F')
  781:                                 {
  782:                                     if (caractere == 1)
  783:                                     {
  784:                                         printf("[%d] Données en provenance du "
  785:                                                 "processus %d (processus "
  786:                                                 "arrêté)\n", (int) getpid(),
  787:                                                 (int) (*s_argument_thread).pid);
  788:                                     }
  789:                                     else
  790:                                     {
  791:                                         printf("[%d] Interruption en "
  792:                                                 "provenance du "
  793:                                                 "processus %d (processus "
  794:                                                 "arrêté)\n", (int) getpid(),
  795:                                                 (int) (*s_argument_thread).pid);
  796:                                     }
  797: 
  798:                                     fflush(stdout);
  799:                                 }
  800:                                 else
  801:                                 {
  802:                                     if (caractere == 1)
  803:                                     {
  804:                                         printf("[%d] Data from process %d "
  805:                                                 "(processus stopped)\n",
  806:                                                 (int) getpid(),
  807:                                                 (int) (*s_argument_thread).pid);
  808:                                     }
  809:                                     else
  810:                                     {
  811:                                         printf("[%d] Interrupt from process %d "
  812:                                                 "(processus stopped)\n",
  813:                                                 (int) getpid(),
  814:                                                 (int) (*s_argument_thread).pid);
  815:                                     }
  816: 
  817:                                     fflush(stdout);
  818:                                 }
  819:                             }
  820: 
  821:                             if (pthread_mutex_lock(
  822:                                     &((*(*((struct_processus_fils *)
  823:                                     (*(*l_element_courant).donnee).objet))
  824:                                     .thread).mutex)) != 0)
  825:                             {
  826:                                 (*s_etat_processus).erreur_systeme =
  827:                                         d_es_processus;
  828:                             }
  829: 
  830:                             if (caractere == 1)
  831:                             {
  832:                                 (*(*((struct_processus_fils *)
  833:                                         (*(*l_element_courant).donnee).objet))
  834:                                         .thread).nombre_objets_dans_pipe++;
  835:                             }
  836:                             else
  837:                             {
  838:                                 (*(*((struct_processus_fils *)
  839:                                         (*(*l_element_courant).donnee).objet))
  840:                                         .thread)
  841:                                         .nombre_interruptions_dans_pipe++;
  842: 
  843:                                 if (pthread_mutex_lock(&((*s_etat_processus)
  844:                                         .mutex_interruptions)) != 0)
  845:                                 {
  846:                                     (*s_etat_processus).erreur_systeme =
  847:                                             d_es_processus;
  848:                                 }
  849: 
  850:                                 (*s_etat_processus)
  851:                                         .nombre_interruptions_non_affectees++;
  852: 
  853:                                 if (pthread_mutex_unlock(&((*s_etat_processus)
  854:                                         .mutex_interruptions)) != 0)
  855:                                 {
  856:                                     (*s_etat_processus).erreur_systeme =
  857:                                             d_es_processus;
  858:                                 }
  859:                             }
  860: 
  861:                             if (pthread_mutex_unlock(
  862:                                     &((*(*((struct_processus_fils *)
  863:                                     (*(*l_element_courant).donnee).objet))
  864:                                     .thread).mutex)) != 0)
  865:                             {
  866:                                 (*s_etat_processus).erreur_systeme =
  867:                                         d_es_processus;
  868:                             }
  869:                         }
  870: 
  871:                         break;
  872:                     }
  873:                 }
  874:                 else
  875:                 {
  876:                     if ((*(*((struct_processus_fils *) (*(*l_element_courant)
  877:                             .donnee).objet)).thread).tid ==
  878:                             (*s_argument_thread).tid)
  879:                     {
  880:                         while(read_atomic(s_etat_processus, (*s_argument_thread)
  881:                                 .pipe_nombre_elements_attente[0],
  882:                                 &caractere, sizeof(caractere)) ==
  883:                                 sizeof(caractere))
  884:                         {
  885:                             if (caractere == 0)
  886:                             {
  887:                                 continue;
  888:                             }
  889: 
  890:                             if ((*s_etat_processus).debug == d_vrai)
  891:                                 if (((*s_etat_processus).type_debug &
  892:                                         d_debug_processus) != 0)
  893:                             {
  894:                                 if ((*s_etat_processus).langue == 'F')
  895:                                 {
  896:                                     if (caractere == 1)
  897:                                     {
  898:                                         printf("[%d] Données en provenance du "
  899:                                                 "thread %llu (processus "
  900:                                                 "arrêté)\n", (int) getpid(),
  901:                                                 (unsigned long long)
  902:                                                 (*s_argument_thread).tid);
  903:                                     }
  904:                                     else
  905:                                     {
  906:                                         printf("[%d] Interruption en "
  907:                                                 "provenance du "
  908:                                                 "thread %llu (processus "
  909:                                                 "arrêté)\n", (int) getpid(),
  910:                                                 (unsigned long long)
  911:                                                 (*s_argument_thread).tid);
  912:                                     }
  913: 
  914:                                     fflush(stdout);
  915:                                 }
  916:                                 else
  917:                                 {
  918:                                     if (caractere == 1)
  919:                                     {
  920:                                         printf("[%d] Data from thread %llu "
  921:                                                 "(processus stopped)\n",
  922:                                                 (int) getpid(),
  923:                                                 (unsigned long long)
  924:                                                 (*s_argument_thread).pid);
  925:                                     }
  926:                                     else
  927:                                     {
  928:                                         printf("[%d] Interrupt from thread "
  929:                                                 "%llu (processus stopped)\n",
  930:                                                 (int) getpid(),
  931:                                                 (unsigned long long)
  932:                                                 (*s_argument_thread).pid);
  933:                                     }
  934: 
  935:                                     fflush(stdout);
  936:                                 }
  937:                             }
  938: 
  939:                             if (pthread_mutex_lock(
  940:                                     &((*(*((struct_processus_fils *)
  941:                                     (*(*l_element_courant).donnee).objet))
  942:                                     .thread).mutex)) != 0)
  943:                             {
  944:                                 (*s_etat_processus).erreur_systeme =
  945:                                         d_es_processus;
  946:                             }
  947: 
  948:                             if (caractere == 1)
  949:                             {
  950:                                 (*(*((struct_processus_fils *)
  951:                                         (*(*l_element_courant).donnee).objet))
  952:                                         .thread).nombre_objets_dans_pipe++;
  953:                             }
  954:                             else
  955:                             {
  956:                                 (*(*((struct_processus_fils *)
  957:                                         (*(*l_element_courant).donnee).objet))
  958:                                         .thread)
  959:                                         .nombre_interruptions_dans_pipe++;
  960: 
  961:                                 if (pthread_mutex_lock(&((*s_etat_processus)
  962:                                         .mutex_interruptions)) != 0)
  963:                                 {
  964:                                     (*s_etat_processus).erreur_systeme =
  965:                                             d_es_processus;
  966:                                 }
  967: 
  968:                                 (*s_etat_processus)
  969:                                         .nombre_interruptions_non_affectees++;
  970: 
  971:                                 if (pthread_mutex_unlock(&((*s_etat_processus)
  972:                                         .mutex_interruptions)) != 0)
  973:                                 {
  974:                                     (*s_etat_processus).erreur_systeme =
  975:                                             d_es_processus;
  976:                                 }
  977:                             }
  978: 
  979:                             if (pthread_mutex_unlock(
  980:                                     &((*(*((struct_processus_fils *)
  981:                                     (*(*l_element_courant).donnee).objet))
  982:                                     .thread).mutex)) != 0)
  983:                             {
  984:                                 (*s_etat_processus).erreur_systeme =
  985:                                         d_es_processus;
  986:                             }
  987:                         }
  988: 
  989:                         break;
  990:                     }
  991:                 }
  992: 
  993:                 l_element_courant = (*l_element_courant).suivant;
  994:             }
  995:         }
  996: 
  997:         if (pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus))
  998:                 != 0)
  999:         {
 1000:             (*s_etat_processus).erreur_systeme_processus_fils =
 1001:                     d_es_processus;
 1002:         }
 1003:     }
 1004: 
 1005:     /*
 1006:      * Traitement des interruptions et des erreurs.
 1007:      */
 1008: 
 1009:     if ((*s_etat_processus).debug == d_vrai)
 1010:         if (((*s_etat_processus).type_debug &
 1011:                 d_debug_processus) != 0)
 1012:     {
 1013:         if ((*s_argument_thread).processus_detache == d_vrai)
 1014:         {
 1015:             if ((*s_etat_processus).langue == 'F')
 1016:             {
 1017:                 printf("[%d] Récupération des erreurs du processus "
 1018:                         "%d\n", (int) getpid(),
 1019:                         (int) (*s_argument_thread).pid);
 1020:                 fflush(stdout);
 1021:             }
 1022:             else
 1023:             {
 1024:                 printf("[%d] Check errors from process %d\n", (int) getpid(),
 1025:                         (int) (*s_argument_thread).pid);
 1026:                 fflush(stdout);
 1027:             }
 1028:         }
 1029:         else
 1030:         {
 1031:             if ((*s_etat_processus).langue == 'F')
 1032:             {
 1033:                 printf("[%d] Récupération des erreurs du thread "
 1034:                         "%llu\n", (int) getpid(), (unsigned long long)
 1035:                         (*s_argument_thread).tid);
 1036:                 fflush(stdout);
 1037:             }
 1038:             else
 1039:             {
 1040:                 printf("[%d] Check errors from process %llu\n", (int) getpid(),
 1041:                         (unsigned long long) (*s_argument_thread).tid);
 1042:                 fflush(stdout);
 1043:             }
 1044:         }
 1045:     }
 1046: 
 1047:     attente.tv_sec = 0;
 1048:     attente.tv_nsec = GRANULARITE_us * 1000;
 1049: 
 1050:     while(read_atomic(s_etat_processus, (*s_argument_thread).pipe_erreurs[0],
 1051:             &tampon_erreur_execution,
 1052:             sizeof((*s_etat_processus).erreur_execution_processus_fils)) !=
 1053:             sizeof((*s_etat_processus).erreur_execution_processus_fils))
 1054:     {
 1055:         nanosleep(&attente, NULL);
 1056:         INCR_GRANULARITE(attente.tv_nsec);
 1057:     }
 1058: 
 1059:     attente.tv_sec = 0;
 1060:     attente.tv_nsec = GRANULARITE_us * 1000;
 1061: 
 1062:     while(read_atomic(s_etat_processus, (*s_argument_thread).pipe_erreurs[0],
 1063:             &tampon_erreur_systeme,
 1064:             sizeof((*s_etat_processus).erreur_systeme_processus_fils)) !=
 1065:             sizeof((*s_etat_processus).erreur_systeme_processus_fils))
 1066:     {
 1067:         nanosleep(&attente, NULL);
 1068:         INCR_GRANULARITE(attente.tv_nsec);
 1069:     }
 1070: 
 1071:     attente.tv_sec = 0;
 1072:     attente.tv_nsec = GRANULARITE_us * 1000;
 1073: 
 1074:     while(read_atomic(s_etat_processus, (*s_argument_thread).pipe_erreurs[0],
 1075:             &pid_erreur,
 1076:             sizeof((*s_etat_processus).pid_erreur_processus_fils)) !=
 1077:             sizeof((*s_etat_processus).pid_erreur_processus_fils))
 1078:     {
 1079:         nanosleep(&attente, NULL);
 1080:         INCR_GRANULARITE(attente.tv_nsec);
 1081:     }
 1082: 
 1083:     /*
 1084:      * Retrait du processus de la pile des processus
 1085:      */
 1086: 
 1087:     if (close((*s_argument_thread).pipe_erreurs[0]) != 0)
 1088:     {
 1089:         (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus;
 1090:     }
 1091: 
 1092:     if (pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus)) != 0)
 1093:     {
 1094:         (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus;
 1095:     }
 1096:     else
 1097:     {
 1098:         (*s_etat_processus).erreur_execution_processus_fils =
 1099:                 tampon_erreur_execution;
 1100:         (*s_etat_processus).erreur_systeme_processus_fils =
 1101:                 tampon_erreur_systeme;
 1102:         (*s_etat_processus).pid_erreur_processus_fils = pid_erreur;
 1103: 
 1104:         /*
 1105:          * Si une erreur est déclarée dans le processus fils, le message
 1106:          * d'erreur a déjà été affiché.
 1107:          */
 1108: 
 1109:         if (((*s_etat_processus).erreur_systeme_processus_fils != d_es) ||
 1110:                 ((*s_etat_processus).erreur_execution_processus_fils != d_ex))
 1111:         {
 1112:             (*s_etat_processus).erreur_processus_fils = d_vrai;
 1113:             (*s_etat_processus).invalidation_message_erreur = d_vrai;
 1114:         }
 1115: 
 1116:         do
 1117:         {
 1118:             drapeau_fin = d_faux;
 1119:             l_element_courant = (struct_liste_chainee *)
 1120:                     (*s_etat_processus).l_base_pile_processus;
 1121:             nombre_donnees = -1;
 1122: 
 1123:             while(l_element_courant != NULL)
 1124:             {
 1125:                 if ((*s_argument_thread).processus_detache == d_vrai)
 1126:                 {
 1127:                     if ((*(*((struct_processus_fils *) (*(*l_element_courant)
 1128:                                 .donnee).objet)).thread).processus_detache
 1129:                                 == d_vrai)
 1130:                     {
 1131:                         if ((*s_argument_thread).pid ==
 1132:                                 (*(*((struct_processus_fils *)
 1133:                                 (*(*l_element_courant)
 1134:                                 .donnee).objet)).thread).pid)
 1135:                         {
 1136:                             if (pthread_mutex_lock(
 1137:                                     &((*(*((struct_processus_fils *)
 1138:                                     (*(*l_element_courant).donnee).objet))
 1139:                                     .thread).mutex)) != 0)
 1140:                             {
 1141:                                 (*s_etat_processus).erreur_systeme =
 1142:                                         d_es_processus;
 1143:                             }
 1144: 
 1145:                             nombre_donnees = (*(*((struct_processus_fils *)
 1146:                                     (*(*l_element_courant).donnee).objet))
 1147:                                     .thread).nombre_objets_dans_pipe +
 1148:                                     (*(*((struct_processus_fils *)
 1149:                                     (*(*l_element_courant).donnee).objet))
 1150:                                     .thread).nombre_interruptions_dans_pipe;
 1151: 
 1152:                             if (pthread_mutex_unlock(
 1153:                                     &((*(*((struct_processus_fils *)
 1154:                                     (*(*l_element_courant).donnee).objet))
 1155:                                     .thread).mutex)) != 0)
 1156:                             {
 1157:                                 (*s_etat_processus).erreur_systeme =
 1158:                                         d_es_processus;
 1159:                             }
 1160: 
 1161:                             break;
 1162:                         }
 1163:                     }
 1164:                 }
 1165:                 else
 1166:                 {
 1167:                     if ((*(*((struct_processus_fils *) (*(*l_element_courant)
 1168:                                 .donnee).objet)).thread).processus_detache
 1169:                                 == d_faux)
 1170:                     {
 1171:                         if (pthread_equal((*s_argument_thread).tid,
 1172:                                 (*(*((struct_processus_fils *)
 1173:                                 (*(*l_element_courant)
 1174:                                 .donnee).objet)).thread).tid) != 0)
 1175:                         {
 1176:                             if (pthread_mutex_lock(
 1177:                                     &((*(*((struct_processus_fils *)
 1178:                                     (*(*l_element_courant).donnee).objet))
 1179:                                     .thread).mutex)) != 0)
 1180:                             {
 1181:                                 (*s_etat_processus).erreur_systeme =
 1182:                                         d_es_processus;
 1183:                             }
 1184: 
 1185:                             nombre_donnees = (*(*((struct_processus_fils *)
 1186:                                     (*(*l_element_courant).donnee).objet))
 1187:                                     .thread).nombre_objets_dans_pipe +
 1188:                                     (*(*((struct_processus_fils *)
 1189:                                     (*(*l_element_courant).donnee).objet))
 1190:                                     .thread).nombre_interruptions_dans_pipe;
 1191: 
 1192:                             if (pthread_mutex_unlock(
 1193:                                     &((*(*((struct_processus_fils *)
 1194:                                     (*(*l_element_courant).donnee).objet))
 1195:                                     .thread).mutex)) != 0)
 1196:                             {
 1197:                                 (*s_etat_processus).erreur_systeme =
 1198:                                         d_es_processus;
 1199:                             }
 1200: 
 1201:                             break;
 1202:                         }
 1203:                     }
 1204:                 }
 1205: 
 1206:                 l_element_courant = (*l_element_courant).suivant;
 1207:             }
 1208: 
 1209:             if (nombre_donnees == -1)
 1210:             {
 1211:                 (*s_etat_processus).erreur_systeme_processus_fils =
 1212:                         d_es_processus;
 1213:                 drapeau_fin = d_vrai;
 1214:                 BUG(1, printf("Process or thread not found"));
 1215:             }
 1216:             else if ((nombre_donnees == 0) ||
 1217:                     ((*s_etat_processus).var_volatile_requete_arret == -1))
 1218:             {
 1219:                 if ((*s_etat_processus).debug == d_vrai)
 1220:                     if (((*s_etat_processus).type_debug &
 1221:                             d_debug_processus) != 0)
 1222:                 {
 1223:                     if ((*s_argument_thread).processus_detache == d_vrai)
 1224:                     {
 1225:                         if ((*s_etat_processus).langue == 'F')
 1226:                         {
 1227:                             printf("[%d] Fermeture des tuyaux du processus "
 1228:                                     "%d\n", (int) getpid(), (int)
 1229:                                     (*s_argument_thread).pid);
 1230:                             fflush(stdout);
 1231:                         }
 1232:                         else
 1233:                         {
 1234:                             printf("[%d] Close remaining pipes "
 1235:                                     "of process %d\n", (int) getpid(),
 1236:                                     (int) (*s_argument_thread).pid);
 1237:                             fflush(stdout);
 1238:                         }
 1239:                     }
 1240:                     else
 1241:                     {
 1242:                         if ((*s_etat_processus).langue == 'F')
 1243:                         {
 1244:                             printf("[%d] Fermeture des tuyaux du thread "
 1245:                                     "%llu\n", (int) getpid(),
 1246:                                     (unsigned long long)
 1247:                                     (*s_argument_thread).tid);
 1248:                             fflush(stdout);
 1249:                         }
 1250:                         else
 1251:                         {
 1252:                             printf("[%d] Close remaining pipes "
 1253:                                     "of thread %llu\n", (int) getpid(),
 1254:                                     (unsigned long long) (*s_argument_thread)
 1255:                                     .tid);
 1256:                             fflush(stdout);
 1257:                         }
 1258:                     }
 1259:                 }
 1260: 
 1261:                 if (close((*s_argument_thread).pipe_objets[0]) != 0)
 1262:                 {
 1263:                     (*s_etat_processus).erreur_systeme_processus_fils =
 1264:                             d_es_processus;
 1265:                 }
 1266: 
 1267:                 if (close((*s_argument_thread).pipe_acquittement[1]) != 0)
 1268:                 {
 1269:                     (*s_etat_processus).erreur_systeme_processus_fils =
 1270:                             d_es_processus;
 1271:                 }
 1272: 
 1273:                 if (close((*s_argument_thread).pipe_injections[1]) != 0)
 1274:                 {
 1275:                     (*s_etat_processus).erreur_systeme_processus_fils =
 1276:                             d_es_processus;
 1277:                 }
 1278: 
 1279:                 if (close((*s_argument_thread).pipe_nombre_injections[1]) != 0)
 1280:                 {
 1281:                     (*s_etat_processus).erreur_systeme_processus_fils =
 1282:                             d_es_processus;
 1283:                 }
 1284: 
 1285:                 if (close((*s_argument_thread)
 1286:                         .pipe_nombre_elements_attente[0]) != 0)
 1287:                 {
 1288:                     (*s_etat_processus).erreur_systeme_processus_fils =
 1289:                             d_es_processus;
 1290:                 }
 1291: 
 1292:                 if (close((*s_argument_thread)
 1293:                         .pipe_interruptions[0]) != 0)
 1294:                 {
 1295:                     (*s_etat_processus).erreur_systeme_processus_fils =
 1296:                             d_es_processus;
 1297:                 }
 1298: 
 1299:                 drapeau_fin = d_vrai;
 1300:             }
 1301:             else
 1302:             {
 1303:                 if (pthread_mutex_unlock(&((*s_etat_processus)
 1304:                         .mutex_pile_processus)) != 0)
 1305:                 {
 1306:                     (*s_etat_processus).erreur_systeme_processus_fils =
 1307:                             d_es_processus;
 1308:                     drapeau_fin = d_vrai;
 1309:                 }
 1310: 
 1311:                 nanosleep(&attente, NULL);
 1312:                 INCR_GRANULARITE(attente.tv_nsec);
 1313: 
 1314:                 if (pthread_mutex_lock(&((*s_etat_processus)
 1315:                         .mutex_pile_processus)) != 0)
 1316:                 {
 1317:                     (*s_etat_processus).erreur_systeme_processus_fils =
 1318:                             d_es_processus;
 1319:                     drapeau_fin = d_vrai;
 1320:                 }
 1321:             }
 1322:         } while(drapeau_fin == d_faux);
 1323: 
 1324:         l_element_courant = (struct_liste_chainee *)
 1325:                 (*s_etat_processus).l_base_pile_processus;
 1326:         l_element_precedent = NULL;
 1327: 
 1328:         while(l_element_courant != NULL)
 1329:         {
 1330:             drapeau = d_faux;
 1331: 
 1332:             if ((*s_argument_thread).processus_detache ==
 1333:                     (*(*((struct_processus_fils *) (*(*l_element_courant)
 1334:                     .donnee).objet)).thread).processus_detache)
 1335:             {
 1336:                 if ((*s_argument_thread).processus_detache == d_vrai)
 1337:                 {
 1338:                     if ((*(*((struct_processus_fils *)
 1339:                             (*(*l_element_courant).donnee).objet))
 1340:                             .thread).pid == (*s_argument_thread).pid)
 1341:                     {
 1342:                         drapeau = d_vrai;
 1343:                     }
 1344:                     else
 1345:                     {
 1346:                         drapeau = d_faux;
 1347:                     }
 1348:                 }
 1349:                 else
 1350:                 {
 1351:                     if (pthread_equal((*(*((struct_processus_fils *)
 1352:                             (*(*l_element_courant).donnee).objet))
 1353:                             .thread).tid, (*s_argument_thread).tid) != 0)
 1354:                     {
 1355:                         drapeau = d_vrai;
 1356:                     }
 1357:                     else
 1358:                     {
 1359:                         drapeau = d_faux;
 1360:                     }
 1361:                 }
 1362:             }
 1363:             else
 1364:             {
 1365:                 drapeau = d_faux;
 1366:             }
 1367: 
 1368:             if (drapeau == d_vrai)
 1369:             {
 1370:                 if (l_element_precedent == NULL)
 1371:                 {
 1372:                     (*s_etat_processus).l_base_pile_processus =
 1373:                             (*l_element_courant).suivant;
 1374:                 }
 1375:                 else
 1376:                 {
 1377:                     (*l_element_precedent).suivant =
 1378:                             (*l_element_courant).suivant;
 1379:                 }
 1380: 
 1381:                 liberation(s_etat_processus, (*l_element_courant).donnee);
 1382:                 free(l_element_courant);
 1383: 
 1384:                 break;
 1385:             }
 1386:             else
 1387:             {
 1388:                 l_element_precedent = l_element_courant;
 1389:                 l_element_courant = (*l_element_courant).suivant;
 1390:             }
 1391:         }
 1392: 
 1393:         if ((*s_etat_processus).debug == d_vrai)
 1394:             if (((*s_etat_processus).type_debug &
 1395:                     d_debug_processus) != 0)
 1396:         {
 1397:             if ((*s_argument_thread).processus_detache == d_vrai)
 1398:             {
 1399:                 if ((*s_etat_processus).langue == 'F')
 1400:                 {
 1401:                     printf("[%d] Arrêt du thread de surveillance du"
 1402:                             " processus %d\n", (int) getpid(),
 1403:                             (int) (*s_argument_thread).pid);
 1404:                 }
 1405:                 else
 1406:                 {
 1407:                     printf("[%d] Stop monitoring of process %d", (int) getpid(),
 1408:                             (int) (*s_argument_thread).pid);
 1409:                 }
 1410:             }
 1411:             else
 1412:             {
 1413:                 if ((*s_etat_processus).langue == 'F')
 1414:                 {
 1415:                     printf("[%d] Arrêt du thread de surveillance du"
 1416:                             " thread %llu\n", (int) getpid(),
 1417:                             (unsigned long long) (*s_argument_thread)
 1418:                             .tid);
 1419:                 }
 1420:                 else
 1421:                 {
 1422:                     printf("[%d] Stop monitoring of thread %llu",
 1423:                             (int) getpid(),
 1424:                             (unsigned long long) (*s_argument_thread)
 1425:                             .tid);
 1426:                 }
 1427:             }
 1428: 
 1429:             fflush(stdout);
 1430:         }
 1431: 
 1432:         if (pthread_mutex_unlock(&((*s_etat_processus)
 1433:                 .mutex_pile_processus)) != 0)
 1434:         {
 1435:             (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus;
 1436:         }
 1437: 
 1438:         retrait_thread_surveillance(s_etat_processus, s_argument_thread);
 1439: 
 1440:         if (pthread_mutex_lock(&((*s_etat_processus)
 1441:                 .mutex_pile_processus)) != 0)
 1442:         {
 1443:             (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus;
 1444:         }
 1445: 
 1446:         nombre_threads_surveillance_processus--;
 1447: 
 1448:         if (pthread_mutex_unlock(&((*s_etat_processus)
 1449:                 .mutex_pile_processus)) != 0)
 1450:         {
 1451:             (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus;
 1452:         }
 1453:     }
 1454: 
 1455:     pthread_exit(NULL);
 1456: }
 1457: 
 1458: 
 1459: /*
 1460: ================================================================================
 1461:   Fonction d'écriture dans un pipe
 1462: ================================================================================
 1463:   Entrées : pointeur sur une structure de description du processus,
 1464:   numéro du pipe et objet à écrire
 1465: --------------------------------------------------------------------------------
 1466:   Sorties :
 1467: --------------------------------------------------------------------------------
 1468:   Effets de bord : néant
 1469: ================================================================================
 1470: */
 1471: 
 1472: logical1
 1473: ecriture_pipe(struct_processus *s_etat_processus, int pipe,
 1474:         struct_objet *s_objet)
 1475: {
 1476:     struct_liste_chainee            *l_element_courant;
 1477: 
 1478:     struct timespec                 attente;
 1479: 
 1480:     integer8                        i;
 1481:     integer8                        j;
 1482: 
 1483:     size_t                          longueur;
 1484:     ssize_t                         longueur_ecriture;
 1485: 
 1486:     if ((*s_objet).type == INT)
 1487:     {
 1488:         attente.tv_sec = 0;
 1489:         attente.tv_nsec = GRANULARITE_us * 1000;
 1490: 
 1491:         while((longueur_ecriture = write_atomic(s_etat_processus,
 1492:                 pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
 1493:                 sizeof((*s_objet).type))
 1494:         {
 1495:             if (longueur_ecriture == -1)
 1496:             {
 1497:                 return(d_erreur);
 1498:             }
 1499: 
 1500:             nanosleep(&attente, NULL);
 1501:             INCR_GRANULARITE(attente.tv_nsec);
 1502:         }
 1503: 
 1504:         attente.tv_sec = 0;
 1505:         attente.tv_nsec = GRANULARITE_us * 1000;
 1506: 
 1507:         while((longueur_ecriture = write_atomic(s_etat_processus,
 1508:                 pipe, (integer8 *)
 1509:                 (*s_objet).objet, sizeof(integer8))) != sizeof(integer8))
 1510:         {
 1511:             if (longueur_ecriture == -1)
 1512:             {
 1513:                 return(d_erreur);
 1514:             }
 1515: 
 1516:             nanosleep(&attente, NULL);
 1517:             INCR_GRANULARITE(attente.tv_nsec);
 1518:         }
 1519:     }
 1520:     else if ((*s_objet).type == REL)
 1521:     {
 1522:         attente.tv_sec = 0;
 1523:         attente.tv_nsec = GRANULARITE_us * 1000;
 1524: 
 1525:         while((longueur_ecriture = write_atomic(s_etat_processus,
 1526:                 pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
 1527:                 sizeof((*s_objet).type))
 1528:         {
 1529:             if (longueur_ecriture == -1)
 1530:             {
 1531:                 return(d_erreur);
 1532:             }
 1533: 
 1534:             nanosleep(&attente, NULL);
 1535:             INCR_GRANULARITE(attente.tv_nsec);
 1536:         }
 1537: 
 1538:         attente.tv_sec = 0;
 1539:         attente.tv_nsec = GRANULARITE_us * 1000;
 1540: 
 1541:         while((longueur_ecriture = write_atomic(s_etat_processus,
 1542:                 pipe, (real8 *) (*s_objet).objet, sizeof(real8))) !=
 1543:                 sizeof(real8))
 1544:         {
 1545:             if (longueur_ecriture == -1)
 1546:             {
 1547:                 return(d_erreur);
 1548:             }
 1549: 
 1550:             nanosleep(&attente, NULL);
 1551:             INCR_GRANULARITE(attente.tv_nsec);
 1552:         }
 1553:     }
 1554:     else if ((*s_objet).type == CPL)
 1555:     {
 1556:         attente.tv_sec = 0;
 1557:         attente.tv_nsec = GRANULARITE_us * 1000;
 1558: 
 1559:         while((longueur_ecriture = write_atomic(s_etat_processus,
 1560:                 pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
 1561:                 sizeof((*s_objet).type))
 1562:         {
 1563:             if (longueur_ecriture == -1)
 1564:             {
 1565:                 return(d_erreur);
 1566:             }
 1567: 
 1568:             nanosleep(&attente, NULL);
 1569:             INCR_GRANULARITE(attente.tv_nsec);
 1570:         }
 1571: 
 1572:         attente.tv_sec = 0;
 1573:         attente.tv_nsec = GRANULARITE_us * 1000;
 1574: 
 1575:         while((longueur_ecriture = write_atomic(s_etat_processus,
 1576:                 pipe, (real8 *) (*s_objet).objet, sizeof(complex16)))
 1577:                 != sizeof(complex16))
 1578:         {
 1579:             if (longueur_ecriture == -1)
 1580:             {
 1581:                 return(d_erreur);
 1582:             }
 1583: 
 1584:             nanosleep(&attente, NULL);
 1585:             INCR_GRANULARITE(attente.tv_nsec);
 1586:         }
 1587:     }
 1588:     else if ((*s_objet).type == VIN)
 1589:     {
 1590:         attente.tv_sec = 0;
 1591:         attente.tv_nsec = GRANULARITE_us * 1000;
 1592: 
 1593:         while((longueur_ecriture = write_atomic(s_etat_processus,
 1594:                 pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
 1595:                 sizeof((*s_objet).type))
 1596:         {
 1597:             if (longueur_ecriture == -1)
 1598:             {
 1599:                 return(d_erreur);
 1600:             }
 1601: 
 1602:             nanosleep(&attente, NULL);
 1603:             INCR_GRANULARITE(attente.tv_nsec);
 1604:         }
 1605: 
 1606:         attente.tv_sec = 0;
 1607:         attente.tv_nsec = GRANULARITE_us * 1000;
 1608: 
 1609:         while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 1610:                 &((*((struct_vecteur *) (*s_objet).objet))
 1611:                 .taille), sizeof(integer8))) != sizeof(integer8))
 1612:         {
 1613:             if (longueur_ecriture == -1)
 1614:             {
 1615:                 return(d_erreur);
 1616:             }
 1617: 
 1618:             nanosleep(&attente, NULL);
 1619:             INCR_GRANULARITE(attente.tv_nsec);
 1620:         }
 1621: 
 1622:         for(i = 0; i < (*((struct_vecteur *) (*s_objet).objet)).taille; i++)
 1623:         {
 1624:             attente.tv_sec = 0;
 1625:             attente.tv_nsec = GRANULARITE_us * 1000;
 1626: 
 1627:             while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 1628:                     &(((integer8 *) (*((struct_vecteur *) (*s_objet).objet))
 1629:                     .tableau)[i]), sizeof(integer8))) != sizeof(integer8))
 1630:             {
 1631:                 if (longueur_ecriture == -1)
 1632:                 {
 1633:                     return(d_erreur);
 1634:                 }
 1635: 
 1636:                 nanosleep(&attente, NULL);
 1637:                 INCR_GRANULARITE(attente.tv_nsec);
 1638:             }
 1639:         }
 1640:     }
 1641:     else if ((*s_objet).type == VRL)
 1642:     {
 1643:         attente.tv_sec = 0;
 1644:         attente.tv_nsec = GRANULARITE_us * 1000;
 1645: 
 1646:         while((longueur_ecriture = write_atomic(s_etat_processus,
 1647:                 pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
 1648:                 sizeof((*s_objet).type))
 1649:         {
 1650:             if (longueur_ecriture == -1)
 1651:             {
 1652:                 return(d_erreur);
 1653:             }
 1654: 
 1655:             nanosleep(&attente, NULL);
 1656:             INCR_GRANULARITE(attente.tv_nsec);
 1657:         }
 1658: 
 1659:         attente.tv_sec = 0;
 1660:         attente.tv_nsec = GRANULARITE_us * 1000;
 1661: 
 1662:         while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 1663:                 &((*((struct_vecteur *) (*s_objet).objet))
 1664:                 .taille), sizeof(integer8))) != sizeof(integer8))
 1665:         {
 1666:             if (longueur_ecriture == -1)
 1667:             {
 1668:                 return(d_erreur);
 1669:             }
 1670: 
 1671:             nanosleep(&attente, NULL);
 1672:             INCR_GRANULARITE(attente.tv_nsec);
 1673:         }
 1674: 
 1675:         for(i = 0; i < (*((struct_vecteur *) (*s_objet).objet)).taille; i++)
 1676:         {
 1677:             attente.tv_sec = 0;
 1678:             attente.tv_nsec = GRANULARITE_us * 1000;
 1679: 
 1680:             while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 1681:                     &(((real8 *) (*((struct_vecteur *) (*s_objet).objet))
 1682:                     .tableau)[i]), sizeof(real8))) != sizeof(real8))
 1683:             {
 1684:                 if (longueur_ecriture == -1)
 1685:                 {
 1686:                     return(d_erreur);
 1687:                 }
 1688: 
 1689:                 nanosleep(&attente, NULL);
 1690:                 INCR_GRANULARITE(attente.tv_nsec);
 1691:             }
 1692:         }
 1693:     }
 1694:     else if ((*s_objet).type == VCX)
 1695:     {
 1696:         attente.tv_sec = 0;
 1697:         attente.tv_nsec = GRANULARITE_us * 1000;
 1698: 
 1699:         while((longueur_ecriture = write_atomic(s_etat_processus,
 1700:                 pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
 1701:                 sizeof((*s_objet).type))
 1702:         {
 1703:             if (longueur_ecriture == -1)
 1704:             {
 1705:                 return(d_erreur);
 1706:             }
 1707: 
 1708:             nanosleep(&attente, NULL);
 1709:             INCR_GRANULARITE(attente.tv_nsec);
 1710:         }
 1711: 
 1712:         attente.tv_sec = 0;
 1713:         attente.tv_nsec = GRANULARITE_us * 1000;
 1714: 
 1715:         while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 1716:                 &((*((struct_vecteur *) (*s_objet).objet))
 1717:                 .taille), sizeof(integer8))) != sizeof(integer8))
 1718:         {
 1719:             if (longueur_ecriture == -1)
 1720:             {
 1721:                 return(d_erreur);
 1722:             }
 1723: 
 1724:             nanosleep(&attente, NULL);
 1725:             INCR_GRANULARITE(attente.tv_nsec);
 1726:         }
 1727: 
 1728:         for(i = 0; i < (*((struct_vecteur *) (*s_objet).objet)).taille; i++)
 1729:         {
 1730:             attente.tv_sec = 0;
 1731:             attente.tv_nsec = GRANULARITE_us * 1000;
 1732: 
 1733:             while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 1734:                     &(((complex16 *) (*((struct_vecteur *) (*s_objet).objet))
 1735:                     .tableau)[i]), sizeof(complex16))) != sizeof(complex16))
 1736:             {
 1737:                 if (longueur_ecriture == -1)
 1738:                 {
 1739:                     return(d_erreur);
 1740:                 }
 1741: 
 1742:                 nanosleep(&attente, NULL);
 1743:                 INCR_GRANULARITE(attente.tv_nsec);
 1744:             }
 1745:         }
 1746:     }
 1747:     else if ((*s_objet).type == MIN)
 1748:     {
 1749:         attente.tv_sec = 0;
 1750:         attente.tv_nsec = GRANULARITE_us * 1000;
 1751: 
 1752:         while((longueur_ecriture = write_atomic(s_etat_processus,
 1753:                 pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
 1754:                 sizeof((*s_objet).type))
 1755:         {
 1756:             if (longueur_ecriture == -1)
 1757:             {
 1758:                 return(d_erreur);
 1759:             }
 1760: 
 1761:             nanosleep(&attente, NULL);
 1762:             INCR_GRANULARITE(attente.tv_nsec);
 1763:         }
 1764: 
 1765:         attente.tv_sec = 0;
 1766:         attente.tv_nsec = GRANULARITE_us * 1000;
 1767: 
 1768:         while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 1769:                 &((*((struct_matrice *) (*s_objet).objet)).nombre_lignes),
 1770:                 sizeof(integer8))) != sizeof(integer8))
 1771:         {
 1772:             if (longueur_ecriture == -1)
 1773:             {
 1774:                 return(d_erreur);
 1775:             }
 1776: 
 1777:             nanosleep(&attente, NULL);
 1778:             INCR_GRANULARITE(attente.tv_nsec);
 1779:         }
 1780: 
 1781:         attente.tv_sec = 0;
 1782:         attente.tv_nsec = GRANULARITE_us * 1000;
 1783: 
 1784:         while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 1785:                 &((*((struct_matrice *) (*s_objet).objet)).nombre_colonnes),
 1786:                 sizeof(integer8))) != sizeof(integer8))
 1787:         {
 1788:             if (longueur_ecriture == -1)
 1789:             {
 1790:                 return(d_erreur);
 1791:             }
 1792: 
 1793:             nanosleep(&attente, NULL);
 1794:             INCR_GRANULARITE(attente.tv_nsec);
 1795:         }
 1796: 
 1797:         for(i = 0; i < (*((struct_matrice *)
 1798:                 (*s_objet).objet)).nombre_lignes; i++)
 1799:         {
 1800:             for(j = 0; j < (*((struct_matrice *)
 1801:                     (*s_objet).objet)).nombre_colonnes; j++)
 1802:             {
 1803:                 attente.tv_sec = 0;
 1804:                 attente.tv_nsec = GRANULARITE_us * 1000;
 1805: 
 1806:                 while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 1807:                         &(((integer8 **) (*((struct_matrice *)
 1808:                         (*s_objet).objet)).tableau)[i][j]),
 1809:                         sizeof(integer8))) != sizeof(integer8))
 1810:                 {
 1811:                     if (longueur_ecriture == -1)
 1812:                     {
 1813:                         return(d_erreur);
 1814:                     }
 1815: 
 1816:                     nanosleep(&attente, NULL);
 1817:                     INCR_GRANULARITE(attente.tv_nsec);
 1818:                 }
 1819:             }
 1820:         }
 1821:     }
 1822:     else if ((*s_objet).type == MRL)
 1823:     {
 1824:         attente.tv_sec = 0;
 1825:         attente.tv_nsec = GRANULARITE_us * 1000;
 1826: 
 1827:         while((longueur_ecriture = write_atomic(s_etat_processus,
 1828:                 pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
 1829:                 sizeof((*s_objet).type))
 1830:         {
 1831:             if (longueur_ecriture == -1)
 1832:             {
 1833:                 return(d_erreur);
 1834:             }
 1835: 
 1836:             nanosleep(&attente, NULL);
 1837:             INCR_GRANULARITE(attente.tv_nsec);
 1838:         }
 1839: 
 1840:         attente.tv_sec = 0;
 1841:         attente.tv_nsec = GRANULARITE_us * 1000;
 1842: 
 1843:         while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 1844:                 &((*((struct_matrice *) (*s_objet).objet)).nombre_lignes),
 1845:                 sizeof(integer8))) != sizeof(integer8))
 1846:         {
 1847:             if (longueur_ecriture == -1)
 1848:             {
 1849:                 return(d_erreur);
 1850:             }
 1851: 
 1852:             nanosleep(&attente, NULL);
 1853:             INCR_GRANULARITE(attente.tv_nsec);
 1854:         }
 1855: 
 1856:         attente.tv_sec = 0;
 1857:         attente.tv_nsec = GRANULARITE_us * 1000;
 1858: 
 1859:         while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 1860:                 &((*((struct_matrice *) (*s_objet).objet)).nombre_colonnes),
 1861:                 sizeof(integer8))) != sizeof(integer8))
 1862:         {
 1863:             if (longueur_ecriture == -1)
 1864:             {
 1865:                 return(d_erreur);
 1866:             }
 1867: 
 1868:             nanosleep(&attente, NULL);
 1869:             INCR_GRANULARITE(attente.tv_nsec);
 1870:         }
 1871: 
 1872:         for(i = 0; i < (*((struct_matrice *)
 1873:                 (*s_objet).objet)).nombre_lignes; i++)
 1874:         {
 1875:             for(j = 0; j < (*((struct_matrice *)
 1876:                     (*s_objet).objet)).nombre_colonnes; j++)
 1877:             {
 1878:                 attente.tv_sec = 0;
 1879:                 attente.tv_nsec = GRANULARITE_us * 1000;
 1880: 
 1881:                 while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 1882:                         &(((real8 **) (*((struct_matrice *)
 1883:                         (*s_objet).objet)).tableau)[i][j]),
 1884:                         sizeof(real8))) != sizeof(real8))
 1885:                 {
 1886:                     if (longueur_ecriture == -1)
 1887:                     {
 1888:                         return(d_erreur);
 1889:                     }
 1890: 
 1891:                     nanosleep(&attente, NULL);
 1892:                     INCR_GRANULARITE(attente.tv_nsec);
 1893:                 }
 1894:             }
 1895:         }
 1896:     }
 1897:     else if ((*s_objet).type == MCX)
 1898:     {
 1899:         attente.tv_sec = 0;
 1900:         attente.tv_nsec = GRANULARITE_us * 1000;
 1901: 
 1902:         while((longueur_ecriture = write_atomic(s_etat_processus,
 1903:                 pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
 1904:                 sizeof((*s_objet).type))
 1905:         {
 1906:             if (longueur_ecriture == -1)
 1907:             {
 1908:                 return(d_erreur);
 1909:             }
 1910: 
 1911:             nanosleep(&attente, NULL);
 1912:             INCR_GRANULARITE(attente.tv_nsec);
 1913:         }
 1914: 
 1915:         attente.tv_sec = 0;
 1916:         attente.tv_nsec = GRANULARITE_us * 1000;
 1917: 
 1918:         while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 1919:                 &((*((struct_matrice *) (*s_objet).objet)).nombre_lignes),
 1920:                 sizeof(integer8))) != sizeof(integer8))
 1921:         {
 1922:             if (longueur_ecriture == -1)
 1923:             {
 1924:                 return(d_erreur);
 1925:             }
 1926: 
 1927:             nanosleep(&attente, NULL);
 1928:             INCR_GRANULARITE(attente.tv_nsec);
 1929:         }
 1930: 
 1931:         attente.tv_sec = 0;
 1932:         attente.tv_nsec = GRANULARITE_us * 1000;
 1933: 
 1934:         while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 1935:                 &((*((struct_matrice *) (*s_objet).objet)).nombre_colonnes),
 1936:                 sizeof(integer8))) != sizeof(integer8))
 1937:         {
 1938:             if (longueur_ecriture == -1)
 1939:             {
 1940:                 return(d_erreur);
 1941:             }
 1942: 
 1943:             nanosleep(&attente, NULL);
 1944:             INCR_GRANULARITE(attente.tv_nsec);
 1945:         }
 1946: 
 1947:         for(i = 0; i < (*((struct_matrice *)
 1948:                 (*s_objet).objet)).nombre_lignes; i++)
 1949:         {
 1950:             for(j = 0; j < (*((struct_matrice *)
 1951:                     (*s_objet).objet)).nombre_colonnes; j++)
 1952:             {
 1953:                 attente.tv_sec = 0;
 1954:                 attente.tv_nsec = GRANULARITE_us * 1000;
 1955: 
 1956:                 while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 1957:                         &(((complex16 **) (*((struct_matrice *)
 1958:                         (*s_objet).objet)).tableau)[i][j]),
 1959:                         sizeof(complex16))) != sizeof(complex16))
 1960:                 {
 1961:                     if (longueur_ecriture == -1)
 1962:                     {
 1963:                         return(d_erreur);
 1964:                     }
 1965: 
 1966:                     nanosleep(&attente, NULL);
 1967:                     INCR_GRANULARITE(attente.tv_nsec);
 1968:                 }
 1969:             }
 1970:         }
 1971:     }
 1972:     else if ((*s_objet).type == BIN)
 1973:     {
 1974:         attente.tv_sec = 0;
 1975:         attente.tv_nsec = GRANULARITE_us * 1000;
 1976: 
 1977:         while((longueur_ecriture = write_atomic(s_etat_processus,
 1978:                 pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
 1979:                 sizeof((*s_objet).type))
 1980:         {
 1981:             if (longueur_ecriture == -1)
 1982:             {
 1983:                 return(d_erreur);
 1984:             }
 1985: 
 1986:             nanosleep(&attente, NULL);
 1987:             INCR_GRANULARITE(attente.tv_nsec);
 1988:         }
 1989: 
 1990:         attente.tv_sec = 0;
 1991:         attente.tv_nsec = GRANULARITE_us * 1000;
 1992: 
 1993:         while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 1994:                 (integer8 *) (*s_objet).objet,
 1995:                 sizeof(integer8))) != sizeof(integer8))
 1996:         {
 1997:             if (longueur_ecriture == -1)
 1998:             {
 1999:                 return(d_erreur);
 2000:             }
 2001: 
 2002:             nanosleep(&attente, NULL);
 2003:             INCR_GRANULARITE(attente.tv_nsec);
 2004:         }
 2005:     }
 2006:     else if ((*s_objet).type == NOM)
 2007:     {
 2008:         attente.tv_sec = 0;
 2009:         attente.tv_nsec = GRANULARITE_us * 1000;
 2010: 
 2011:         while((longueur_ecriture = write_atomic(s_etat_processus,
 2012:                 pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
 2013:                 sizeof((*s_objet).type))
 2014:         {
 2015:             if (longueur_ecriture == -1)
 2016:             {
 2017:                 return(d_erreur);
 2018:             }
 2019: 
 2020:             nanosleep(&attente, NULL);
 2021:             INCR_GRANULARITE(attente.tv_nsec);
 2022:         }
 2023: 
 2024:         longueur = strlen((*((struct_nom *) (*s_objet).objet)).nom) + 1;
 2025: 
 2026:         attente.tv_sec = 0;
 2027:         attente.tv_nsec = GRANULARITE_us * 1000;
 2028: 
 2029:         while((longueur_ecriture = write_atomic(s_etat_processus,
 2030:                 pipe, &longueur, sizeof(size_t))) != sizeof(size_t))
 2031:         {
 2032:             if (longueur_ecriture == -1)
 2033:             {
 2034:                 return(d_erreur);
 2035:             }
 2036: 
 2037:             nanosleep(&attente, NULL);
 2038:             INCR_GRANULARITE(attente.tv_nsec);
 2039:         }
 2040: 
 2041:         attente.tv_sec = 0;
 2042:         attente.tv_nsec = GRANULARITE_us * 1000;
 2043: 
 2044:         while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 2045:                 (*((struct_nom *) (*s_objet).objet)).nom,
 2046:                 longueur)) != (ssize_t) longueur)
 2047:         {
 2048:             if (longueur_ecriture == -1)
 2049:             {
 2050:                 return(d_erreur);
 2051:             }
 2052: 
 2053:             nanosleep(&attente, NULL);
 2054:             INCR_GRANULARITE(attente.tv_nsec);
 2055:         }
 2056: 
 2057:         attente.tv_sec = 0;
 2058:         attente.tv_nsec = GRANULARITE_us * 1000;
 2059: 
 2060:         while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 2061:                 &((*((struct_nom *) (*s_objet).objet))
 2062:                 .symbole), sizeof(logical1))) != sizeof(logical1))
 2063:         {
 2064:             if (longueur_ecriture == -1)
 2065:             {
 2066:                 return(d_erreur);
 2067:             }
 2068: 
 2069:             nanosleep(&attente, NULL);
 2070:             INCR_GRANULARITE(attente.tv_nsec);
 2071:         }
 2072:     }
 2073:     else if ((*s_objet).type == FCT)
 2074:     {
 2075:         attente.tv_sec = 0;
 2076:         attente.tv_nsec = GRANULARITE_us * 1000;
 2077: 
 2078:         while((longueur_ecriture = write_atomic(s_etat_processus,
 2079:                 pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
 2080:                 sizeof((*s_objet).type))
 2081:         {
 2082:             if (longueur_ecriture == -1)
 2083:             {
 2084:                 return(d_erreur);
 2085:             }
 2086: 
 2087:             nanosleep(&attente, NULL);
 2088:             INCR_GRANULARITE(attente.tv_nsec);
 2089:         }
 2090: 
 2091:         longueur = strlen((*((struct_fonction *)
 2092:                 (*s_objet).objet)).nom_fonction) + 1;
 2093: 
 2094:         attente.tv_sec = 0;
 2095:         attente.tv_nsec = GRANULARITE_us * 1000;
 2096: 
 2097:         while((longueur_ecriture = write_atomic(s_etat_processus,
 2098:                 pipe, &longueur, sizeof(size_t))) != sizeof(size_t))
 2099:         {
 2100:             if (longueur_ecriture == -1)
 2101:             {
 2102:                 return(d_erreur);
 2103:             }
 2104: 
 2105:             nanosleep(&attente, NULL);
 2106:             INCR_GRANULARITE(attente.tv_nsec);
 2107:         }
 2108: 
 2109:         attente.tv_sec = 0;
 2110:         attente.tv_nsec = GRANULARITE_us * 1000;
 2111: 
 2112:         while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 2113:                 (*((struct_fonction *) (*s_objet).objet))
 2114:                 .nom_fonction, longueur)) != (ssize_t) longueur)
 2115:         {
 2116:             if (longueur_ecriture == -1)
 2117:             {
 2118:                 return(d_erreur);
 2119:             }
 2120: 
 2121:             nanosleep(&attente, NULL);
 2122:             INCR_GRANULARITE(attente.tv_nsec);
 2123:         }
 2124: 
 2125:         attente.tv_sec = 0;
 2126:         attente.tv_nsec = GRANULARITE_us * 1000;
 2127: 
 2128:         while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 2129:                 &((*((struct_fonction *) (*s_objet).objet)).nombre_arguments),
 2130:                 sizeof(integer8))) != sizeof(integer8))
 2131:         {
 2132:             if (longueur_ecriture == -1)
 2133:             {
 2134:                 return(d_erreur);
 2135:             }
 2136: 
 2137:             nanosleep(&attente, NULL);
 2138:             INCR_GRANULARITE(attente.tv_nsec);
 2139:         }
 2140:     }
 2141:     else if ((*s_objet).type == CHN)
 2142:     {
 2143:         attente.tv_sec = 0;
 2144:         attente.tv_nsec = GRANULARITE_us * 1000;
 2145: 
 2146:         while((longueur_ecriture = write_atomic(s_etat_processus,
 2147:                 pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
 2148:                 sizeof((*s_objet).type))
 2149:         {
 2150:             if (longueur_ecriture == -1)
 2151:             {
 2152:                 return(d_erreur);
 2153:             }
 2154: 
 2155:             nanosleep(&attente, NULL);
 2156:             INCR_GRANULARITE(attente.tv_nsec);
 2157:         }
 2158: 
 2159:         longueur = strlen((unsigned char *) (*s_objet).objet) + 1;
 2160: 
 2161:         attente.tv_sec = 0;
 2162:         attente.tv_nsec = GRANULARITE_us * 1000;
 2163: 
 2164:         while((longueur_ecriture = write_atomic(s_etat_processus,
 2165:                 pipe, &longueur, sizeof(size_t))) != sizeof(size_t))
 2166:         {
 2167:             if (longueur_ecriture == -1)
 2168:             {
 2169:                 return(d_erreur);
 2170:             }
 2171: 
 2172:             nanosleep(&attente, NULL);
 2173:             INCR_GRANULARITE(attente.tv_nsec);
 2174:         }
 2175: 
 2176:         attente.tv_sec = 0;
 2177:         attente.tv_nsec = GRANULARITE_us * 1000;
 2178: 
 2179:         while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 2180:                 (unsigned char *) (*s_objet).objet,
 2181:                 longueur)) != (ssize_t) longueur)
 2182:         {
 2183:             if (longueur_ecriture == -1)
 2184:             {
 2185:                 return(d_erreur);
 2186:             }
 2187: 
 2188:             nanosleep(&attente, NULL);
 2189:             INCR_GRANULARITE(attente.tv_nsec);
 2190:         }
 2191:     }
 2192:     else if (((*s_objet).type == LST) ||
 2193:             ((*s_objet).type == ALG) ||
 2194:             ((*s_objet).type == RPN))
 2195:     {
 2196:         attente.tv_sec = 0;
 2197:         attente.tv_nsec = GRANULARITE_us * 1000;
 2198: 
 2199:         while((longueur_ecriture = write_atomic(s_etat_processus,
 2200:                 pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
 2201:                 sizeof((*s_objet).type))
 2202:         {
 2203:             if (longueur_ecriture == -1)
 2204:             {
 2205:                 return(d_erreur);
 2206:             }
 2207: 
 2208:             nanosleep(&attente, NULL);
 2209:             INCR_GRANULARITE(attente.tv_nsec);
 2210:         }
 2211: 
 2212:         l_element_courant = (*s_objet).objet;
 2213:         i = 0;
 2214: 
 2215:         while(l_element_courant != NULL)
 2216:         {
 2217:             i++;
 2218:             l_element_courant = (*l_element_courant).suivant;
 2219:         }
 2220: 
 2221:         attente.tv_sec = 0;
 2222:         attente.tv_nsec = GRANULARITE_us * 1000;
 2223: 
 2224:         while((longueur_ecriture = write_atomic(s_etat_processus,
 2225:                 pipe, &i, sizeof(i))) != sizeof(i))
 2226:         {
 2227:             if (longueur_ecriture == -1)
 2228:             {
 2229:                 return(d_erreur);
 2230:             }
 2231: 
 2232:             nanosleep(&attente, NULL);
 2233:             INCR_GRANULARITE(attente.tv_nsec);
 2234:         }
 2235: 
 2236:         l_element_courant = (*s_objet).objet;
 2237: 
 2238:         while(l_element_courant != NULL)
 2239:         {
 2240:             if (ecriture_pipe(s_etat_processus, pipe,
 2241:                     (*l_element_courant).donnee) == d_erreur)
 2242:             {
 2243:                 return(d_erreur);
 2244:             }
 2245: 
 2246:             l_element_courant = (*l_element_courant).suivant;
 2247:         }
 2248:     }
 2249:     else if ((*s_objet).type == TBL)
 2250:     {
 2251:         attente.tv_sec = 0;
 2252:         attente.tv_nsec = GRANULARITE_us * 1000;
 2253: 
 2254:         while((longueur_ecriture = write_atomic(s_etat_processus,
 2255:                 pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
 2256:                 sizeof((*s_objet).type))
 2257:         {
 2258:             if (longueur_ecriture == -1)
 2259:             {
 2260:                 return(d_erreur);
 2261:             }
 2262: 
 2263:             nanosleep(&attente, NULL);
 2264:             INCR_GRANULARITE(attente.tv_nsec);
 2265:         }
 2266: 
 2267:         attente.tv_sec = 0;
 2268:         attente.tv_nsec = GRANULARITE_us * 1000;
 2269: 
 2270:         while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
 2271:                 &((*((struct_tableau *) (*s_objet).objet)).nombre_elements),
 2272:                 sizeof(integer8))) != sizeof(integer8))
 2273:         {
 2274:             if (longueur_ecriture == -1)
 2275:             {
 2276:                 return(d_erreur);
 2277:             }
 2278: 
 2279:             nanosleep(&attente, NULL);
 2280:             INCR_GRANULARITE(attente.tv_nsec);
 2281:         }
 2282: 
 2283:         for(i = 0; i < (*((struct_tableau *)
 2284:                 (*s_objet).objet)).nombre_elements; i++)
 2285:         {
 2286:             if (ecriture_pipe(s_etat_processus, pipe,
 2287:                     (*((struct_tableau *) (*s_objet).objet)).elements[i])
 2288:                     == d_erreur)
 2289:             {
 2290:                 return(d_erreur);
 2291:             }
 2292:         }
 2293:     }
 2294:     else
 2295:     {
 2296:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 2297:         return(d_erreur);
 2298:     }
 2299: 
 2300:     return(d_absence_erreur);
 2301: }
 2302: 
 2303: 
 2304: /*
 2305: ================================================================================
 2306:   Fonction de lecture dans un pipe
 2307: ================================================================================
 2308:   Entrées : pointeur sur une structure de description du processus,
 2309:   numéro du pipe et objet à écrire
 2310: --------------------------------------------------------------------------------
 2311:   Sorties :
 2312: --------------------------------------------------------------------------------
 2313:   Effets de bord : néant
 2314: ================================================================================
 2315: */
 2316: 
 2317: struct_objet *
 2318: lecture_pipe(struct_processus *s_etat_processus, int pipe)
 2319: {
 2320:     size_t                  longueur;
 2321: 
 2322:     struct_liste_chainee    *l_element_courant;
 2323: 
 2324:     struct_objet            *s_objet;
 2325: 
 2326:     struct timespec         attente;
 2327: 
 2328:     integer8                i;
 2329:     integer8                j;
 2330: 
 2331:     if ((s_objet = allocation(s_etat_processus, NON)) == NULL)
 2332:     {
 2333:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2334:         return(NULL);
 2335:     }
 2336: 
 2337:     attente.tv_sec = 0;
 2338:     attente.tv_nsec = GRANULARITE_us * 1000;
 2339: 
 2340:     while(read_atomic(s_etat_processus, pipe, &((*s_objet).type),
 2341:             sizeof((*s_objet).type)) != sizeof((*s_objet).type))
 2342:     {
 2343:         nanosleep(&attente, NULL);
 2344:         INCR_GRANULARITE(attente.tv_nsec);
 2345:     }
 2346: 
 2347:     if ((*s_objet).type == INT)
 2348:     {
 2349:         if (((*s_objet).objet = malloc(sizeof(integer8))) == NULL)
 2350:         {
 2351:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2352:             return(NULL);
 2353:         }
 2354: 
 2355:         attente.tv_sec = 0;
 2356:         attente.tv_nsec = GRANULARITE_us * 1000;
 2357: 
 2358:         while(read_atomic(s_etat_processus, pipe,
 2359:                 (*s_objet).objet, sizeof(integer8)) != sizeof(integer8))
 2360:         {
 2361:             nanosleep(&attente, NULL);
 2362:             INCR_GRANULARITE(attente.tv_nsec);
 2363:         }
 2364:     }
 2365:     else if ((*s_objet).type == REL)
 2366:     {
 2367:         if (((*s_objet).objet = malloc(sizeof(real8))) == NULL)
 2368:         {
 2369:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2370:             return(NULL);
 2371:         }
 2372: 
 2373:         attente.tv_sec = 0;
 2374:         attente.tv_nsec = GRANULARITE_us * 1000;
 2375: 
 2376:         while(read_atomic(s_etat_processus, pipe,
 2377:                 (*s_objet).objet, sizeof(real8)) != sizeof(real8))
 2378:         {
 2379:             nanosleep(&attente, NULL);
 2380:             INCR_GRANULARITE(attente.tv_nsec);
 2381:         }
 2382:     }
 2383:     else if ((*s_objet).type == CPL)
 2384:     {
 2385:         if (((*s_objet).objet = malloc(sizeof(complex16))) == NULL)
 2386:         {
 2387:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2388:             return(NULL);
 2389:         }
 2390: 
 2391:         attente.tv_sec = 0;
 2392:         attente.tv_nsec = GRANULARITE_us * 1000;
 2393: 
 2394:         while(read_atomic(s_etat_processus, pipe,
 2395:                 (*s_objet).objet, sizeof(complex16)) != sizeof(complex16))
 2396:         {
 2397:             nanosleep(&attente, NULL);
 2398:             INCR_GRANULARITE(attente.tv_nsec);
 2399:         }
 2400:     }
 2401:     else if ((*s_objet).type == VIN)
 2402:     {
 2403:         if (((*s_objet).objet = malloc(sizeof(struct_vecteur))) == NULL)
 2404:         {
 2405:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2406:             return(NULL);
 2407:         }
 2408: 
 2409:         (*((struct_vecteur *) (*s_objet).objet)).type = 'I';
 2410: 
 2411:         attente.tv_sec = 0;
 2412:         attente.tv_nsec = GRANULARITE_us * 1000;
 2413: 
 2414:         while(read_atomic(s_etat_processus, pipe, &((*((struct_vecteur *)
 2415:                 (*s_objet).objet)).taille),
 2416:                 sizeof(integer8)) != sizeof(integer8))
 2417:         {
 2418:             nanosleep(&attente, NULL);
 2419:             INCR_GRANULARITE(attente.tv_nsec);
 2420:         }
 2421: 
 2422:         if (((*((struct_vecteur *) (*s_objet).objet)).tableau =
 2423:                 malloc(((size_t) (*((struct_vecteur *) (*s_objet).objet))
 2424:                 .taille) * sizeof(integer8))) == NULL)
 2425:         {
 2426:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2427:             return(NULL);
 2428:         }
 2429: 
 2430:         for(i = 0; i < (*((struct_vecteur *) (*s_objet).objet)).taille; i++)
 2431:         {
 2432:             attente.tv_sec = 0;
 2433:             attente.tv_nsec = GRANULARITE_us * 1000;
 2434: 
 2435:             while(read_atomic(s_etat_processus, pipe,
 2436:                     &(((integer8 *) (*((struct_vecteur *)
 2437:                     (*s_objet).objet)).tableau)[i]), sizeof(integer8)) !=
 2438:                     sizeof(integer8))
 2439:             {
 2440:                 nanosleep(&attente, NULL);
 2441:                 INCR_GRANULARITE(attente.tv_nsec);
 2442:             }
 2443:         }
 2444:     }
 2445:     else if ((*s_objet).type == VRL)
 2446:     {
 2447:         if (((*s_objet).objet = malloc(sizeof(struct_vecteur))) == NULL)
 2448:         {
 2449:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2450:             return(NULL);
 2451:         }
 2452: 
 2453:         (*((struct_vecteur *) (*s_objet).objet)).type = 'R';
 2454: 
 2455:         attente.tv_sec = 0;
 2456:         attente.tv_nsec = GRANULARITE_us * 1000;
 2457: 
 2458:         while(read_atomic(s_etat_processus, pipe, &((*((struct_vecteur *)
 2459:                 (*s_objet).objet)).taille),
 2460:                 sizeof(integer8)) != sizeof(integer8))
 2461:         {
 2462:             nanosleep(&attente, NULL);
 2463:             INCR_GRANULARITE(attente.tv_nsec);
 2464:         }
 2465: 
 2466:         if (((*((struct_vecteur *) (*s_objet).objet)).tableau =
 2467:                 malloc(((size_t) (*((struct_vecteur *) (*s_objet).objet))
 2468:                 .taille) * sizeof(real8))) == NULL)
 2469:         {
 2470:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2471:             return(NULL);
 2472:         }
 2473: 
 2474:         for(i = 0; i < (*((struct_vecteur *) (*s_objet).objet)).taille; i++)
 2475:         {
 2476:             attente.tv_sec = 0;
 2477:             attente.tv_nsec = GRANULARITE_us * 1000;
 2478: 
 2479:             while(read_atomic(s_etat_processus, pipe,
 2480:                     &(((real8 *) (*((struct_vecteur *)
 2481:                     (*s_objet).objet)).tableau)[i]), sizeof(real8)) !=
 2482:                     sizeof(real8))
 2483:             {
 2484:                 nanosleep(&attente, NULL);
 2485:                 INCR_GRANULARITE(attente.tv_nsec);
 2486:             }
 2487:         }
 2488:     }
 2489:     else if ((*s_objet).type == VCX)
 2490:     {
 2491:         if (((*s_objet).objet = malloc(sizeof(struct_vecteur))) == NULL)
 2492:         {
 2493:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2494:             return(NULL);
 2495:         }
 2496: 
 2497:         (*((struct_vecteur *) (*s_objet).objet)).type = 'C';
 2498: 
 2499:         attente.tv_sec = 0;
 2500:         attente.tv_nsec = GRANULARITE_us * 1000;
 2501: 
 2502:         while(read_atomic(s_etat_processus, pipe, &((*((struct_vecteur *)
 2503:                 (*s_objet).objet)).taille),
 2504:                 sizeof(integer8)) != sizeof(integer8))
 2505:         {
 2506:             nanosleep(&attente, NULL);
 2507:             INCR_GRANULARITE(attente.tv_nsec);
 2508:         }
 2509: 
 2510:         if (((*((struct_vecteur *) (*s_objet).objet)).tableau =
 2511:                 malloc(((size_t) (*((struct_vecteur *) (*s_objet).objet))
 2512:                 .taille) * sizeof(complex16))) == NULL)
 2513:         {
 2514:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2515:             return(NULL);
 2516:         }
 2517: 
 2518:         for(i = 0; i < (*((struct_vecteur *) (*s_objet).objet)).taille; i++)
 2519:         {
 2520:             attente.tv_sec = 0;
 2521:             attente.tv_nsec = GRANULARITE_us * 1000;
 2522: 
 2523:             while(read_atomic(s_etat_processus, pipe,
 2524:                     &(((complex16 *) (*((struct_vecteur *)
 2525:                     (*s_objet).objet)).tableau)[i]), sizeof(complex16)) !=
 2526:                     sizeof(complex16))
 2527:             {
 2528:                 nanosleep(&attente, NULL);
 2529:                 INCR_GRANULARITE(attente.tv_nsec);
 2530:             }
 2531:         }
 2532:     }
 2533:     else if ((*s_objet).type == MIN)
 2534:     {
 2535:         if (((*s_objet).objet = malloc(sizeof(struct_matrice))) == NULL)
 2536:         {
 2537:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2538:             return(NULL);
 2539:         }
 2540: 
 2541:         (*((struct_matrice *) (*s_objet).objet)).type = 'I';
 2542: 
 2543:         attente.tv_sec = 0;
 2544:         attente.tv_nsec = GRANULARITE_us * 1000;
 2545: 
 2546:         while(read_atomic(s_etat_processus, pipe, &((*((struct_matrice *)
 2547:                 (*s_objet).objet)).nombre_lignes),
 2548:                 sizeof(integer8)) != sizeof(integer8))
 2549:         {
 2550:             nanosleep(&attente, NULL);
 2551:             INCR_GRANULARITE(attente.tv_nsec);
 2552:         }
 2553: 
 2554:         attente.tv_sec = 0;
 2555:         attente.tv_nsec = GRANULARITE_us * 1000;
 2556: 
 2557:         while(read_atomic(s_etat_processus, pipe, &((*((struct_matrice *)
 2558:                 (*s_objet).objet)).nombre_colonnes),
 2559:                 sizeof(integer8)) != sizeof(integer8))
 2560:         {
 2561:             nanosleep(&attente, NULL);
 2562:             INCR_GRANULARITE(attente.tv_nsec);
 2563:         }
 2564: 
 2565:         if (((*((struct_matrice *) (*s_objet).objet)).tableau =
 2566:                 malloc(((size_t) (*((struct_matrice *) (*s_objet).objet))
 2567:                 .nombre_lignes) * sizeof(integer8 *))) == NULL)
 2568:         {
 2569:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2570:             return(NULL);
 2571:         }
 2572: 
 2573:         for(i = 0; i < (*((struct_matrice *)
 2574:                 (*s_objet).objet)).nombre_lignes; i++)
 2575:         {
 2576:             if ((((*((struct_matrice *) (*s_objet).objet)).tableau)[i] =
 2577:                     malloc(((size_t) (*((struct_matrice *) (*s_objet).objet))
 2578:                     .nombre_colonnes) * sizeof(integer8))) == NULL)
 2579:             {
 2580:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2581:                 return(NULL);
 2582:             }
 2583: 
 2584:             for(j = 0; j < (*((struct_matrice *)
 2585:                     (*s_objet).objet)).nombre_colonnes; j++)
 2586:             {
 2587:                 attente.tv_sec = 0;
 2588:                 attente.tv_nsec = GRANULARITE_us * 1000;
 2589: 
 2590:                 while(read_atomic(s_etat_processus,
 2591:                         pipe, &(((integer8 **) (*((struct_matrice *)
 2592:                         (*s_objet).objet)).tableau)[i][j]),
 2593:                         sizeof(integer8)) != sizeof(integer8))
 2594:                 {
 2595:                     nanosleep(&attente, NULL);
 2596:                     INCR_GRANULARITE(attente.tv_nsec);
 2597:                 }
 2598:             }
 2599:         }
 2600:     }
 2601:     else if ((*s_objet).type == MRL)
 2602:     {
 2603:         if (((*s_objet).objet = malloc(sizeof(struct_matrice))) == NULL)
 2604:         {
 2605:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2606:             return(NULL);
 2607:         }
 2608: 
 2609:         (*((struct_matrice *) (*s_objet).objet)).type = 'R';
 2610: 
 2611:         attente.tv_sec = 0;
 2612:         attente.tv_nsec = GRANULARITE_us * 1000;
 2613: 
 2614:         while(read_atomic(s_etat_processus, pipe, &((*((struct_matrice *)
 2615:                 (*s_objet).objet)).nombre_lignes),
 2616:                 sizeof(integer8)) != sizeof(integer8))
 2617:         {
 2618:             nanosleep(&attente, NULL);
 2619:             INCR_GRANULARITE(attente.tv_nsec);
 2620:         }
 2621: 
 2622:         attente.tv_sec = 0;
 2623:         attente.tv_nsec = GRANULARITE_us * 1000;
 2624: 
 2625:         while(read_atomic(s_etat_processus, pipe, &((*((struct_matrice *)
 2626:                 (*s_objet).objet)).nombre_colonnes),
 2627:                 sizeof(integer8)) != sizeof(integer8))
 2628:         {
 2629:             nanosleep(&attente, NULL);
 2630:             INCR_GRANULARITE(attente.tv_nsec);
 2631:         }
 2632: 
 2633:         if (((*((struct_matrice *) (*s_objet).objet)).tableau =
 2634:                 malloc(((size_t) (*((struct_matrice *) (*s_objet).objet))
 2635:                 .nombre_lignes) * sizeof(real8 *))) == NULL)
 2636:         {
 2637:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2638:             return(NULL);
 2639:         }
 2640: 
 2641:         for(i = 0; i < (*((struct_matrice *)
 2642:                 (*s_objet).objet)).nombre_lignes; i++)
 2643:         {
 2644:             if ((((*((struct_matrice *) (*s_objet).objet)).tableau)[i] =
 2645:                     malloc(((size_t) (*((struct_matrice *) (*s_objet).objet))
 2646:                     .nombre_colonnes) * sizeof(real8))) == NULL)
 2647:             {
 2648:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2649:                 return(NULL);
 2650:             }
 2651: 
 2652:             for(j = 0; j < (*((struct_matrice *)
 2653:                     (*s_objet).objet)).nombre_colonnes; j++)
 2654:             {
 2655:                 attente.tv_sec = 0;
 2656:                 attente.tv_nsec = GRANULARITE_us * 1000;
 2657: 
 2658:                 while(read_atomic(s_etat_processus,
 2659:                         pipe, &(((real8 **) (*((struct_matrice *)
 2660:                         (*s_objet).objet)).tableau)[i][j]),
 2661:                         sizeof(real8)) != sizeof(real8))
 2662:                 {
 2663:                     nanosleep(&attente, NULL);
 2664:                     INCR_GRANULARITE(attente.tv_nsec);
 2665:                 }
 2666:             }
 2667:         }
 2668:     }
 2669:     else if ((*s_objet).type == MCX)
 2670:     {
 2671:         if (((*s_objet).objet = malloc(sizeof(struct_matrice))) == NULL)
 2672:         {
 2673:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2674:             return(NULL);
 2675:         }
 2676: 
 2677:         (*((struct_matrice *) (*s_objet).objet)).type = 'C';
 2678: 
 2679:         attente.tv_sec = 0;
 2680:         attente.tv_nsec = GRANULARITE_us * 1000;
 2681: 
 2682:         while(read_atomic(s_etat_processus, pipe, &((*((struct_matrice *)
 2683:                 (*s_objet).objet)).nombre_lignes),
 2684:                 sizeof(integer8)) != sizeof(integer8))
 2685:         {
 2686:             nanosleep(&attente, NULL);
 2687:             INCR_GRANULARITE(attente.tv_nsec);
 2688:         }
 2689: 
 2690:         attente.tv_sec = 0;
 2691:         attente.tv_nsec = GRANULARITE_us * 1000;
 2692: 
 2693:         while(read_atomic(s_etat_processus, pipe, &((*((struct_matrice *)
 2694:                 (*s_objet).objet)).nombre_colonnes),
 2695:                 sizeof(integer8)) != sizeof(integer8))
 2696:         {
 2697:             nanosleep(&attente, NULL);
 2698:             INCR_GRANULARITE(attente.tv_nsec);
 2699:         }
 2700: 
 2701:         if (((*((struct_matrice *) (*s_objet).objet)).tableau =
 2702:                 malloc(((size_t) (*((struct_matrice *) (*s_objet).objet))
 2703:                 .nombre_lignes) * sizeof(complex16 *))) == NULL)
 2704:         {
 2705:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2706:             return(NULL);
 2707:         }
 2708: 
 2709:         for(i = 0; i < (*((struct_matrice *)
 2710:                 (*s_objet).objet)).nombre_lignes; i++)
 2711:         {
 2712:             if ((((*((struct_matrice *) (*s_objet).objet)).tableau)[i] =
 2713:                     malloc(((size_t) (*((struct_matrice *) (*s_objet).objet))
 2714:                     .nombre_colonnes) * sizeof(complex16))) == NULL)
 2715:             {
 2716:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2717:                 return(NULL);
 2718:             }
 2719: 
 2720:             for(j = 0; j < (*((struct_matrice *)
 2721:                     (*s_objet).objet)).nombre_colonnes; j++)
 2722:             {
 2723:                 attente.tv_sec = 0;
 2724:                 attente.tv_nsec = GRANULARITE_us * 1000;
 2725: 
 2726:                 while(read_atomic(s_etat_processus, pipe,
 2727:                         &(((complex16 **) (*((struct_matrice *)
 2728:                         (*s_objet).objet)).tableau)[i][j]),
 2729:                         sizeof(complex16)) != sizeof(complex16))
 2730:                 {
 2731:                     nanosleep(&attente, NULL);
 2732:                     INCR_GRANULARITE(attente.tv_nsec);
 2733:                 }
 2734:             }
 2735:         }
 2736:     }
 2737:     else if ((*s_objet).type == BIN)
 2738:     {
 2739:         if (((*s_objet).objet = malloc(sizeof(integer8))) == NULL)
 2740:         {
 2741:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2742:             return(NULL);
 2743:         }
 2744: 
 2745:         attente.tv_sec = 0;
 2746:         attente.tv_nsec = GRANULARITE_us * 1000;
 2747: 
 2748:         while(read_atomic(s_etat_processus, pipe,
 2749:                 (*s_objet).objet, sizeof(integer8)) != sizeof(integer8))
 2750:         {
 2751:             nanosleep(&attente, NULL);
 2752:             INCR_GRANULARITE(attente.tv_nsec);
 2753:         }
 2754:     }
 2755:     else if ((*s_objet).type == NOM)
 2756:     {
 2757:         if (((*s_objet).objet = malloc(sizeof(struct_nom))) == NULL)
 2758:         {
 2759:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2760:             return(NULL);
 2761:         }
 2762: 
 2763:         attente.tv_sec = 0;
 2764:         attente.tv_nsec = GRANULARITE_us * 1000;
 2765: 
 2766:         while(read_atomic(s_etat_processus,
 2767:                 pipe, &longueur, sizeof(size_t)) != sizeof(size_t))
 2768:         {
 2769:             nanosleep(&attente, NULL);
 2770:             INCR_GRANULARITE(attente.tv_nsec);
 2771:         }
 2772: 
 2773:         if (((*((struct_nom *) (*s_objet).objet)).nom = malloc(longueur *
 2774:                 sizeof(unsigned char))) == NULL)
 2775:         {
 2776:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2777:             return(NULL);
 2778:         }
 2779: 
 2780:         attente.tv_sec = 0;
 2781:         attente.tv_nsec = GRANULARITE_us * 1000;
 2782: 
 2783:         while(read_atomic(s_etat_processus, pipe, (*((struct_nom *)
 2784:                 (*s_objet).objet)).nom, longueur) != (ssize_t) longueur)
 2785:         {
 2786:             nanosleep(&attente, NULL);
 2787:             INCR_GRANULARITE(attente.tv_nsec);
 2788:         }
 2789: 
 2790:         attente.tv_sec = 0;
 2791:         attente.tv_nsec = GRANULARITE_us * 1000;
 2792: 
 2793:         while(read_atomic(s_etat_processus, pipe,
 2794:                 &((*((struct_nom *) (*s_objet).objet)).symbole),
 2795:                 sizeof(logical1)) != sizeof(logical1))
 2796:         {
 2797:             nanosleep(&attente, NULL);
 2798:             INCR_GRANULARITE(attente.tv_nsec);
 2799:         }
 2800:     }
 2801:     else if ((*s_objet).type == FCT)
 2802:     {
 2803:         if (((*s_objet).objet = allocation(s_etat_processus, FCT)) == NULL)
 2804:         {
 2805:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2806:             return(NULL);
 2807:         }
 2808: 
 2809:         attente.tv_sec = 0;
 2810:         attente.tv_nsec = GRANULARITE_us * 1000;
 2811: 
 2812:         while(read_atomic(s_etat_processus, pipe,
 2813:                 &longueur, sizeof(size_t)) != sizeof(size_t))
 2814:         {
 2815:             nanosleep(&attente, NULL);
 2816:             INCR_GRANULARITE(attente.tv_nsec);
 2817:         }
 2818: 
 2819:         if (((*((struct_fonction *) (*s_objet).objet)).nom_fonction =
 2820:                 malloc(longueur * sizeof(unsigned char))) == NULL)
 2821:         {
 2822:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2823:             return(NULL);
 2824:         }
 2825: 
 2826:         attente.tv_sec = 0;
 2827:         attente.tv_nsec = GRANULARITE_us * 1000;
 2828: 
 2829:         while(read_atomic(s_etat_processus, pipe,
 2830:                 (*((struct_fonction *) (*s_objet).objet))
 2831:                 .nom_fonction, longueur) != (ssize_t) longueur)
 2832:         {
 2833:             nanosleep(&attente, NULL);
 2834:             INCR_GRANULARITE(attente.tv_nsec);
 2835:         }
 2836: 
 2837:         attente.tv_sec = 0;
 2838:         attente.tv_nsec = GRANULARITE_us * 1000;
 2839: 
 2840:         while(read_atomic(s_etat_processus, pipe,
 2841:                 &((*((struct_fonction *) (*s_objet).objet))
 2842:                 .nombre_arguments), sizeof(integer8)) !=
 2843:                 sizeof(integer8))
 2844:         {
 2845:             nanosleep(&attente, NULL);
 2846:             INCR_GRANULARITE(attente.tv_nsec);
 2847:         }
 2848: 
 2849:         (*((struct_fonction *) (*s_objet).objet)).fonction = NULL;
 2850:         (*((struct_fonction *) (*s_objet).objet)).prediction_saut = NULL;
 2851:         (*((struct_fonction *) (*s_objet).objet)).prediction_execution = d_faux;
 2852:     }
 2853:     else if ((*s_objet).type == CHN)
 2854:     {
 2855:         attente.tv_sec = 0;
 2856:         attente.tv_nsec = GRANULARITE_us * 1000;
 2857: 
 2858:         while(read_atomic(s_etat_processus, pipe,
 2859:                 &longueur, sizeof(size_t)) != sizeof(size_t))
 2860:         {
 2861:             nanosleep(&attente, NULL);
 2862:             INCR_GRANULARITE(attente.tv_nsec);
 2863:         }
 2864: 
 2865:         if (((*s_objet).objet = malloc(longueur *
 2866:                 sizeof(unsigned char))) == NULL)
 2867:         {
 2868:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2869:             return(NULL);
 2870:         }
 2871: 
 2872:         attente.tv_sec = 0;
 2873:         attente.tv_nsec = GRANULARITE_us * 1000;
 2874: 
 2875:         while(read_atomic(s_etat_processus, pipe, (unsigned char *)
 2876:                 (*s_objet).objet, longueur) != (ssize_t) longueur)
 2877:         {
 2878:             nanosleep(&attente, NULL);
 2879:             INCR_GRANULARITE(attente.tv_nsec);
 2880:         }
 2881:     }
 2882:     else if (((*s_objet).type == LST) ||
 2883:             ((*s_objet).type == ALG) ||
 2884:             ((*s_objet).type == RPN))
 2885:     {
 2886:         attente.tv_sec = 0;
 2887:         attente.tv_nsec = GRANULARITE_us * 1000;
 2888: 
 2889:         while(read_atomic(s_etat_processus, pipe, &j, sizeof(j)) != sizeof(j))
 2890:         {
 2891:             nanosleep(&attente, NULL);
 2892:             INCR_GRANULARITE(attente.tv_nsec);
 2893:         }
 2894: 
 2895:         l_element_courant = NULL;
 2896: 
 2897:         for(i = 0; i < j; i++)
 2898:         {
 2899:             if (l_element_courant == NULL)
 2900:             {
 2901:                 if ((l_element_courant =
 2902:                         malloc(sizeof(struct_liste_chainee))) == NULL)
 2903:                 {
 2904:                     (*s_etat_processus).erreur_systeme =
 2905:                             d_es_allocation_memoire;
 2906:                     return(NULL);
 2907:                 }
 2908: 
 2909:                 (*s_objet).objet = l_element_courant;
 2910:             }
 2911:             else
 2912:             {
 2913:                 if (((*l_element_courant).suivant =
 2914:                         malloc(sizeof(struct_liste_chainee))) == NULL)
 2915:                 {
 2916:                     (*s_etat_processus).erreur_systeme =
 2917:                             d_es_allocation_memoire;
 2918:                     return(NULL);
 2919:                 }
 2920: 
 2921:                 l_element_courant = (*l_element_courant).suivant;
 2922:                 (*l_element_courant).suivant = NULL;
 2923:             }
 2924: 
 2925:             attente.tv_sec = 0;
 2926:             attente.tv_nsec = GRANULARITE_us * 1000;
 2927: 
 2928:             while(((*l_element_courant).donnee = lecture_pipe(s_etat_processus,
 2929:                     pipe)) == NULL)
 2930:             {
 2931:                 if ((*s_etat_processus).erreur_systeme != d_es)
 2932:                 {
 2933:                     return(NULL);
 2934:                 }
 2935: 
 2936:                 nanosleep(&attente, NULL);
 2937:                 INCR_GRANULARITE(attente.tv_nsec);
 2938:             }
 2939:         }
 2940: 
 2941:         if (l_element_courant == NULL)
 2942:         {
 2943:             (*s_objet).objet = NULL;
 2944:         }
 2945:         else
 2946:         {
 2947:             (*l_element_courant).suivant = NULL;
 2948:         }
 2949:     }
 2950:     else if ((*s_objet).type == TBL)
 2951:     {
 2952:         if (((*s_objet).objet = malloc(sizeof(struct_tableau))) == NULL)
 2953:         {
 2954:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2955:             return(NULL);
 2956:         }
 2957: 
 2958:         attente.tv_sec = 0;
 2959:         attente.tv_nsec = GRANULARITE_us * 1000;
 2960: 
 2961:         while(read_atomic(s_etat_processus, pipe, &((*((struct_tableau *)
 2962:                 (*s_objet).objet)).nombre_elements),
 2963:                 sizeof(integer8)) != sizeof(integer8))
 2964:         {
 2965:             nanosleep(&attente, NULL);
 2966:             INCR_GRANULARITE(attente.tv_nsec);
 2967:         }
 2968: 
 2969:         if (((*((struct_tableau *) (*s_objet).objet)).elements = malloc(
 2970:                 ((size_t) (*((struct_tableau *) (*s_objet).objet))
 2971:                 .nombre_elements) * sizeof(struct_objet *))) == NULL)
 2972:         {
 2973:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 2974:             return(NULL);
 2975:         }
 2976: 
 2977:         for(i = 0; i < (*((struct_tableau *) (*s_objet).objet)).nombre_elements;
 2978:                 i++)
 2979:         {
 2980:             attente.tv_sec = 0;
 2981:             attente.tv_nsec = GRANULARITE_us * 1000;
 2982: 
 2983:             while(((*((struct_tableau *) (*s_objet).objet)).elements[i] =
 2984:                     lecture_pipe(s_etat_processus, pipe)) == NULL)
 2985:             {
 2986:                 if ((*s_etat_processus).erreur_systeme != d_es)
 2987:                 {
 2988:                     return(NULL);
 2989:                 }
 2990: 
 2991:                 nanosleep(&attente, NULL);
 2992:                 INCR_GRANULARITE(attente.tv_nsec);
 2993:             }
 2994:         }
 2995:     }
 2996: 
 2997:     return(s_objet);
 2998: }
 2999: 
 3000: 
 3001: /*
 3002: ================================================================================
 3003:   Fonction de scrutation des données injectées par le processus père
 3004: ================================================================================
 3005:   Entrées : pointeur sur une structure
 3006: --------------------------------------------------------------------------------
 3007:   Sorties :
 3008: --------------------------------------------------------------------------------
 3009:   Effets de bord : néant
 3010: ================================================================================
 3011: */
 3012: 
 3013: void
 3014: scrutation_injection(struct_processus *s_etat_processus)
 3015: {
 3016:     logical1                        drapeau_erreur;
 3017:     logical1                        registre_arret_si_exception;
 3018: 
 3019:     struct pollfd                   fds;
 3020: 
 3021:     unsigned char                   tampon;
 3022:     unsigned char                   tampon_profilage[20];
 3023: 
 3024:     scrutation_interruptions(s_etat_processus);
 3025: 
 3026:     // Si on est dans le processus père, il n'y a rien à surveiller.
 3027: 
 3028:     if ((*s_etat_processus).var_volatile_processus_racine == 0)
 3029:     {
 3030:         fds.fd = (*s_etat_processus).pipe_nombre_injections;
 3031:         fds.events = POLLIN;
 3032:         fds.revents = 0;
 3033: 
 3034:         if (poll(&fds, 1, 0) > 0)
 3035:         {
 3036:             if (read_atomic(s_etat_processus,
 3037:                     (*s_etat_processus).pipe_nombre_injections,
 3038:                     &tampon, sizeof(unsigned char)) == sizeof(unsigned char))
 3039:             {
 3040:                 if (tampon == '-')
 3041:                 {
 3042:                     (*s_etat_processus).nombre_objets_injectes++;
 3043:                 }
 3044:                 else if (tampon == '+')
 3045:                 {
 3046:                     (*s_etat_processus).nombre_objets_envoyes_non_lus--;
 3047: 
 3048:                     BUG((*s_etat_processus).nombre_objets_envoyes_non_lus < 0,
 3049:                             printf("(*s_etat_processus).nombre_objets_envoyes_"
 3050:                             "non_lus=%d\n", (*s_etat_processus)
 3051:                             .nombre_objets_envoyes_non_lus));
 3052:                 }
 3053:                 else
 3054:                 {
 3055:                     BUG(1, printf("tampon='%c' (%d)\n", tampon, tampon));
 3056:                 }
 3057:             }
 3058:         }
 3059: 
 3060:         /*
 3061:          * Traitement de l'interruption d'injection
 3062:          */
 3063: 
 3064:         if (((*s_etat_processus).nombre_objets_injectes != 0) &&
 3065:                 ((*s_etat_processus).traitement_at_poke == 'N'))
 3066:         {
 3067:             if ((*s_etat_processus).at_poke != NULL)
 3068:             {
 3069:                 registre_arret_si_exception =
 3070:                         (*s_etat_processus).arret_si_exception;
 3071:                 (*s_etat_processus).arret_si_exception = d_vrai;
 3072: 
 3073:                 if ((*s_etat_processus).debug == d_vrai)
 3074:                     if (((*s_etat_processus).type_debug &
 3075:                             d_traitement_interruption) != 0)
 3076:                 {
 3077:                     if ((*s_etat_processus).langue == 'F')
 3078:                     {
 3079:                         printf("[%d] Traitement de l'interruption "
 3080:                                 "d'injection\n", (int) getpid());
 3081:                     }
 3082:                     else
 3083:                     {
 3084:                         printf("[%d] Start injection interrupt\n",
 3085:                                 (int) getpid());
 3086:                     }
 3087: 
 3088:                     fflush(stdout);
 3089:                 }
 3090: 
 3091:                 if ((*s_etat_processus).profilage == d_vrai)
 3092:                 {
 3093:                     sprintf(tampon_profilage, "Injection interrupt");
 3094:                     profilage(s_etat_processus, tampon_profilage);
 3095: 
 3096:                     if ((*s_etat_processus).erreur_systeme != d_es)
 3097:                     {
 3098:                         return;
 3099:                     }
 3100:                 }
 3101: 
 3102:                 (*s_etat_processus).traitement_at_poke = 'Y';
 3103:                 drapeau_erreur = evaluation(s_etat_processus,
 3104:                         (*s_etat_processus).at_poke, 'E');
 3105:                 (*s_etat_processus).traitement_at_poke = 'N';
 3106: 
 3107:                 if ((*s_etat_processus).profilage == d_vrai)
 3108:                 {
 3109:                     profilage(s_etat_processus, NULL);
 3110:                 }
 3111: 
 3112:                 if (drapeau_erreur == d_absence_erreur)
 3113:                 {
 3114:                     (*s_etat_processus).arret_si_exception =
 3115:                             registre_arret_si_exception;
 3116:                 }
 3117:                 else
 3118:                 {
 3119:                     if ((((*s_etat_processus).erreur_execution != d_ex) ||
 3120:                             ((*s_etat_processus).exception != d_ep) ||
 3121:                             ((*s_etat_processus).erreur_systeme != d_es)) &&
 3122:                             ((*s_etat_processus).core == d_vrai) &&
 3123:                             ((*s_etat_processus)
 3124:                             .var_volatile_traitement_sigint == 0))
 3125:                     {
 3126:                         printf("\n");
 3127:                         
 3128:                         if ((*s_etat_processus).langue == 'F')
 3129:                         {
 3130:                             printf("+++Information : "
 3131:                                     "Génération du fichier rpl-core "
 3132:                                     "[%d]\n", (int) getpid());
 3133:                         }
 3134:                         else
 3135:                         {
 3136:                             printf("+++Information : "
 3137:                                     "Writing rpl-core file [%d]\n",
 3138:                                     (int) getpid());
 3139:                         }
 3140: 
 3141:                         rplcore(s_etat_processus);
 3142: 
 3143:                         if ((*s_etat_processus).langue == 'F')
 3144:                         {
 3145:                             printf("+++Information : "
 3146:                                     "Processus tracé [%d]\n",
 3147:                                     (int) getpid());
 3148:                         }
 3149:                         else
 3150:                         {
 3151:                             printf("+++Information : Done [%d]\n",
 3152:                                     (int) getpid());
 3153:                         }
 3154: 
 3155:                         printf("\n");
 3156:                         fflush(stdout);
 3157:                     }
 3158: 
 3159:                 }
 3160: 
 3161:                 if ((*s_etat_processus).debug == d_vrai)
 3162:                     if (((*s_etat_processus).type_debug &
 3163:                             d_traitement_interruption) != 0)
 3164:                 {
 3165:                     if ((*s_etat_processus).langue == 'F')
 3166:                     {
 3167:                         printf("[%d] Fin de l'interruption d'injection\n",
 3168:                                 (int) getpid());
 3169:                     }
 3170:                     else
 3171:                     {
 3172:                         printf("[%d] Stop injection interrupt\n",
 3173:                                 (int) getpid());
 3174:                     }
 3175: 
 3176:                     fflush(stdout);
 3177:                 }
 3178: 
 3179:                 if ((drapeau_erreur == d_erreur) &&
 3180:                         ((*s_etat_processus).erreur_execution == d_ex))
 3181:                 {
 3182:                     if (((*s_etat_processus).erreur_execution == d_ex) &&
 3183:                             ((*s_etat_processus).erreur_systeme == d_es))
 3184:                     {
 3185:                         (*s_etat_processus).erreur_execution =
 3186:                                 d_ex_erreur_evaluation;
 3187:                     }
 3188:                 }
 3189:             }
 3190:         }
 3191:     }
 3192: 
 3193:     return;
 3194: }
 3195: 
 3196: 
 3197: /*
 3198: ================================================================================
 3199:   Fonction de test du drapeau d'arrêt
 3200: ================================================================================
 3201:   Entrées : pointeur sur une structure
 3202: --------------------------------------------------------------------------------
 3203:   Sorties :
 3204: --------------------------------------------------------------------------------
 3205:   Effets de bord : néant
 3206: ================================================================================
 3207: */
 3208: 
 3209: int
 3210: test_arret(struct_processus *s_etat_processus)
 3211: {
 3212:     return((int) (*s_etat_processus).var_volatile_requete_arret);
 3213: }
 3214: 
 3215: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>