File:  [local] / rpl / src / gestion_threads.c
Revision 1.99: download - view: text, annotated - select for diffs - revision graph
Thu Nov 26 11:44:32 2015 UTC (8 years, 5 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_24, HEAD
Mise à jour de Lapack (3.6.0) et du numéro de version du RPL/2.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.1.24
    4:   Copyright (C) 1989-2015 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 lancement d'un thread
   29: ================================================================================
   30:   Entrées : pointeur sur une structure
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void *
   39: lancement_thread(void *argument)
   40: {
   41:     int                                 status;
   42: 
   43:     pid_t                               ppid;
   44: 
   45:     sig_atomic_t                        registre_stop;
   46: 
   47:     ssize_t                             longueur_ecriture;
   48: 
   49:     struct_descripteur_thread           *s_argument_thread;
   50: 
   51:     struct_liste_chainee                *l_element_courant;
   52:     struct_liste_chainee                *l_element_suivant;
   53: 
   54:     struct_liste_variables_statiques    *l_element_statique_courant;
   55:     struct_liste_variables_statiques    *l_element_statique_suivant;
   56: 
   57:     struct_objet                        *s_objet_temporaire;
   58: 
   59:     struct_processus                    *s_etat_processus;
   60: 
   61:     struct sigaction                    action;
   62:     struct sigaction                    registre;
   63: 
   64:     struct timespec                     attente;
   65: 
   66:     unsigned char                       caractere;
   67:     unsigned char                       *message;
   68: 
   69:     unsigned int                        erreur;
   70: 
   71:     integer8                            i;
   72: 
   73:     attente.tv_sec = 0;
   74:     attente.tv_nsec = GRANULARITE_us * 1000;
   75: 
   76:     s_argument_thread = (struct_descripteur_thread *) argument;
   77:     s_etat_processus = (*s_argument_thread).s_nouvel_etat_processus;
   78: 
   79: #   ifndef SEMAPHORES_NOMMES
   80:         sem_init(&((*s_etat_processus).semaphore_fork), 0, 0);
   81: #   else
   82:         if (((*s_etat_processus).semaphore_fork = sem_init3(0, getpid(),
   83:                 pthread_self(), SEM_FORK)) == SEM_FAILED)
   84:         {
   85:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
   86:             return(NULL);
   87:         }
   88: #   endif
   89: 
   90:     (*s_argument_thread).tid = pthread_self();
   91:     insertion_thread(s_etat_processus, d_faux);
   92: 
   93:     if (pthread_mutex_lock(&((*s_argument_thread).mutex)) != 0)
   94:     {
   95:         (*s_etat_processus).erreur_systeme = d_es_processus;
   96:         return(NULL);
   97:     }
   98: 
   99:     (*s_argument_thread).thread_actif = d_vrai;
  100: 
  101:     if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0)
  102:     {
  103:         (*s_etat_processus).erreur_systeme = d_es_processus;
  104:         return(NULL);
  105:     }
  106: 
  107:     // Envoi d'une donnée pour signaler le démarrage du thread au thread
  108:     // de surveillance.
  109: 
  110:     caractere = 0;
  111: 
  112:     if (write_atomic(s_etat_processus,
  113:             (*s_argument_thread).pipe_nombre_elements_attente[1],
  114:             &caractere, sizeof(caractere)) != sizeof(caractere))
  115:     {
  116:         (*s_etat_processus).erreur_systeme = d_es_processus;
  117: 
  118:         pthread_mutex_lock(&((*s_argument_thread).mutex));
  119:         pthread_mutex_unlock(&((*s_argument_thread).mutex));
  120: 
  121:         (*s_argument_thread).thread_actif = d_faux;
  122: 
  123:         while((longueur_ecriture = write_atomic(s_etat_processus,
  124:                 (*s_argument_thread).pipe_nombre_elements_attente[1],
  125:                 &caractere, sizeof(caractere))) != sizeof(caractere))
  126:         {
  127:             if (longueur_ecriture == -1)
  128:             {
  129:                 break;
  130:             }
  131:         }
  132: 
  133:         pthread_exit(NULL);
  134:     }
  135: 
  136:     if ((*s_etat_processus).evaluation_expression_compilee == 'N')
  137:     {
  138:         free((*s_etat_processus).instruction_courante);
  139:         (*s_etat_processus).instruction_courante = NULL;
  140:     }
  141: 
  142:     // Attente de la réception du signal rpl_sigstart.
  143: 
  144:     for((*s_etat_processus).demarrage_fils = d_faux;;)
  145:     {
  146:         scrutation_interruptions(s_etat_processus);
  147: 
  148:         if ((*s_etat_processus).demarrage_fils == d_vrai)
  149:         {
  150:             break;
  151:         }
  152: 
  153:         nanosleep(&attente, NULL);
  154:     }
  155: 
  156:     if ((*s_etat_processus).debug == d_vrai)
  157:         if (((*s_etat_processus).type_debug & d_debug_processus) != 0)
  158:     {
  159:         if ((*s_etat_processus).langue == 'F')
  160:         {
  161:             printf("[%d] Lancement du thread %llu\n", (int) getpid(),
  162:                     (unsigned long long) pthread_self());
  163:         }
  164:         else
  165:         {
  166:             printf("[%d] Start thread %llu\n", (int) getpid(),
  167:                     (unsigned long long) pthread_self());
  168:         }
  169: 
  170:         fflush(stdout);
  171:     }
  172: 
  173:     (*s_etat_processus).pid_erreur_processus_fils = getpid();
  174: 
  175:     // Évaluation de l'objet
  176: 
  177:     if ((*s_etat_processus).erreur_systeme == d_es)
  178:     {
  179:         if (setjmp(contexte_thread) == 0)
  180:         {
  181:             if (evaluation(s_etat_processus, (*s_argument_thread).argument, 'E')
  182:                     == d_erreur)
  183:             {
  184:                 if (((*s_etat_processus).erreur_execution == d_ex) &&
  185:                         ((*s_etat_processus).erreur_systeme == d_es))
  186:                 {
  187:                     (*s_etat_processus).erreur_execution =
  188:                             d_ex_erreur_evaluation;
  189:                 }
  190:             }
  191:             else
  192:             {
  193:                 if (((*s_etat_processus).arret_depuis_abort == 0)
  194:                         && ((*s_etat_processus).at_exit != NULL))
  195:                 {
  196:                     (*s_etat_processus).var_volatile_requete_arret = 0;
  197:                     (*s_etat_processus).var_volatile_alarme = 0;
  198:                     (*s_etat_processus).var_volatile_traitement_sigint = 0;
  199: 
  200:                     if ((*s_etat_processus).profilage == d_vrai)
  201:                     {
  202:                         profilage(s_etat_processus, "ATEXIT");
  203:                     }
  204: 
  205:                     if (evaluation(s_etat_processus,
  206:                             (*s_etat_processus).at_exit, 'E') == d_erreur)
  207:                     {
  208:                         if (((*s_etat_processus).erreur_execution == d_ex) &&
  209:                                 ((*s_etat_processus).erreur_systeme == d_es))
  210:                         {
  211:                             (*s_etat_processus).erreur_execution =
  212:                                     d_ex_erreur_evaluation;
  213:                         }
  214:                     }
  215: 
  216:                     if ((*s_etat_processus).profilage == d_vrai)
  217:                     {
  218:                         profilage(s_etat_processus, NULL);
  219:                     }
  220:                 }
  221:             }
  222:         }
  223: 
  224:         if ((*s_argument_thread).destruction_objet == d_vrai)
  225:         {
  226:             liberation(s_etat_processus, (*s_argument_thread).argument);
  227:         }
  228:     }
  229: 
  230:     if ((*s_etat_processus).presence_fusible == d_vrai)
  231:     {
  232:         pthread_cancel((*s_etat_processus).thread_fusible);
  233:     }
  234: 
  235:     caractere = 0;
  236: 
  237:     while((longueur_ecriture = write_atomic(s_etat_processus,
  238:             (*s_argument_thread).pipe_nombre_elements_attente[1],
  239:             &caractere, sizeof(caractere))) != sizeof(caractere))
  240:     {
  241:         if (longueur_ecriture == -1)
  242:         {
  243:             break;
  244:         }
  245:     }
  246: 
  247:     if ((*s_etat_processus).var_volatile_processus_pere != 0)
  248:     {
  249:         // Racine des processus atteinte
  250: 
  251:         erreur = d_ex;
  252: 
  253:         while((longueur_ecriture = write_atomic(s_etat_processus,
  254:                 (*s_argument_thread).pipe_erreurs[1], &erreur,
  255:                 sizeof((*s_etat_processus).erreur_execution))) !=
  256:                 sizeof((*s_etat_processus).erreur_execution))
  257:         {
  258:             if (longueur_ecriture == -1)
  259:             {
  260:                 break;
  261:             }
  262:         }
  263:     }
  264:     else
  265:     {
  266:         while((longueur_ecriture = write_atomic(s_etat_processus,
  267:                 (*s_argument_thread).pipe_erreurs[1],
  268:                 (int *) &((*s_etat_processus).erreur_execution),
  269:                 sizeof((*s_etat_processus).erreur_execution))) !=
  270:                 sizeof((*s_etat_processus).erreur_execution))
  271:         {
  272:             if (longueur_ecriture == -1)
  273:             {
  274:                 break;
  275:             }
  276:         }
  277:     }
  278: 
  279:     if ((*s_etat_processus).var_volatile_processus_pere != 0)
  280:     {
  281:         // Racine des processus atteinte
  282: 
  283:         erreur = d_es;
  284: 
  285:         while((longueur_ecriture = write_atomic(s_etat_processus,
  286:                 (*s_argument_thread).pipe_erreurs[1], &erreur,
  287:                 sizeof((*s_etat_processus).erreur_systeme))) !=
  288:                 sizeof((*s_etat_processus).erreur_systeme))
  289:         {
  290:             if (longueur_ecriture == -1)
  291:             {
  292:                 break;
  293:             }
  294:         }
  295:     }
  296:     else
  297:     {
  298:         while((longueur_ecriture = write_atomic(s_etat_processus,
  299:                 (*s_argument_thread).pipe_erreurs[1],
  300:                 (int *) &((*s_etat_processus).erreur_systeme),
  301:                 sizeof((*s_etat_processus).erreur_systeme))) !=
  302:                 sizeof((*s_etat_processus).erreur_systeme))
  303:         {
  304:             if (longueur_ecriture == -1)
  305:             {
  306:                 break;
  307:             }
  308:         }
  309:     }
  310: 
  311:     if ((*s_etat_processus).pid_erreur_processus_fils == 0)
  312:     {
  313:         ppid = getpid();
  314: 
  315:         while((longueur_ecriture = write_atomic(s_etat_processus,
  316:                 (*s_argument_thread).pipe_erreurs[1],
  317:                 &ppid, sizeof(ppid))) != sizeof(ppid))
  318:         {
  319:             if (longueur_ecriture == -1)
  320:             {
  321:                 break;
  322:             }
  323:         }
  324:     }
  325:     else
  326:     {
  327:         while((longueur_ecriture = write_atomic(s_etat_processus,
  328:                 (*s_argument_thread).pipe_erreurs[1],
  329:                 &((*s_etat_processus).pid_erreur_processus_fils),
  330:                 sizeof((*s_etat_processus).pid_erreur_processus_fils))) !=
  331:                 sizeof((*s_etat_processus).pid_erreur_processus_fils))
  332:         {
  333:             if (longueur_ecriture == -1)
  334:             {
  335:                 break;
  336:             }
  337:         }
  338:     }
  339: 
  340:     close((*s_argument_thread).pipe_erreurs[1]);
  341:     close((*s_argument_thread).pipe_interruptions[1]);
  342:     close((*s_argument_thread).pipe_nombre_elements_attente[1]);
  343:     close((*s_argument_thread).pipe_objets[1]);
  344:     close((*s_argument_thread).pipe_injections[0]);
  345:     close((*s_argument_thread).pipe_nombre_injections[0]);
  346:     close((*s_argument_thread).pipe_acquittement[0]);
  347: 
  348:     l_element_courant = (*s_etat_processus).s_fichiers;
  349: 
  350:     while(l_element_courant != NULL)
  351:     {
  352:         l_element_suivant = (*l_element_courant).suivant;
  353: 
  354:         if ((*((struct_descripteur_fichier *) (*l_element_courant)
  355:                 .donnee)).pid == getpid())
  356:         {
  357:             fclose((*((struct_descripteur_fichier *)
  358:                     (*l_element_courant).donnee)).descripteur_c);
  359: 
  360:             if ((*((struct_descripteur_fichier *)
  361:                     (*l_element_courant).donnee)).type != 'C')
  362:             {
  363:                 sqlite3_close((*((struct_descripteur_fichier *)
  364:                         (*l_element_courant).donnee)).descripteur_sqlite);
  365:             }
  366: 
  367:             if ((*((struct_descripteur_fichier *) (*l_element_courant)
  368:                     .donnee)).effacement == 'Y')
  369:             {
  370:                 unlink((*((struct_descripteur_fichier *)
  371:                         (*l_element_courant).donnee)).nom);
  372:             }
  373:         }
  374: 
  375:         free((*((struct_descripteur_fichier *) (*l_element_courant)
  376:                 .donnee)).nom);
  377:         free((struct_descripteur_fichier *) (*l_element_courant).donnee);
  378:         free(l_element_courant);
  379: 
  380:         l_element_courant = l_element_suivant;
  381:     }
  382: 
  383:     pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus));
  384: 
  385:     l_element_courant = (struct_liste_chainee *)
  386:             (*s_etat_processus).l_base_pile_processus;
  387: 
  388:     while(l_element_courant != NULL)
  389:     {
  390:         if ((*(*((struct_processus_fils *) (*(*l_element_courant).donnee)
  391:                 .objet)).thread).processus_detache == d_vrai)
  392:         {
  393:             if ((*s_etat_processus).debug == d_vrai)
  394:             {
  395:                 if (((*s_etat_processus).type_debug & d_debug_processus) != 0)
  396:                 {
  397:                     if ((*s_etat_processus).langue == 'F')
  398:                     {
  399:                         printf("[%d] Signalement pour arrêt du processus %d\n",
  400:                                 (int) getpid(),
  401:                                 (int) (*(*((struct_processus_fils *)
  402:                                 (*(*l_element_courant).donnee).objet)).thread)
  403:                                 .pid);
  404:                     }
  405:                     else
  406:                     {
  407:                         printf("[%d] Send stop signal to process %d\n",
  408:                                 (int) getpid(),
  409:                                 (int) (*(*((struct_processus_fils *)
  410:                                 (*(*l_element_courant).donnee).objet)).thread)
  411:                                 .pid);
  412:                     }
  413:                 }
  414:             }
  415: 
  416:             if ((*s_etat_processus).var_volatile_alarme != 0)
  417:             {
  418:                 envoi_signal_processus((*(*((struct_processus_fils *)
  419:                         (*(*l_element_courant)
  420:                         .donnee).objet)).thread).pid, rpl_sigurg);
  421:             }
  422:             else
  423:             {
  424:                 if ((*s_etat_processus).arret_depuis_abort == -1)
  425:                 {
  426:                     envoi_signal_processus((*(*((struct_processus_fils *)
  427:                             (*(*l_element_courant)
  428:                             .donnee).objet)).thread).pid, rpl_sigabort);
  429:                 }
  430:                 else
  431:                 {
  432:                     envoi_signal_processus((*(*((struct_processus_fils *)
  433:                             (*(*l_element_courant)
  434:                             .donnee).objet)).thread).pid, rpl_sigstop);
  435:                 }
  436:             }
  437:         }
  438:         else
  439:         {
  440:             if ((*s_etat_processus).debug == d_vrai)
  441:             {
  442:                 if (((*s_etat_processus).type_debug & d_debug_processus) != 0)
  443:                 {
  444:                     if ((*s_etat_processus).langue == 'F')
  445:                     {
  446:                         printf("[%d] Signalement pour arrêt du thread %llu\n",
  447:                                 (int) getpid(), (unsigned long long)
  448:                                 (*(*((struct_processus_fils *)
  449:                                 (*(*l_element_courant).donnee).objet)).thread)
  450:                                 .tid);
  451:                     }
  452:                     else
  453:                     {
  454:                         printf("[%d] Send stop signal to thread %llu\n",
  455:                                 (int) getpid(), (unsigned long long)
  456:                                 (*(*((struct_processus_fils *)
  457:                                 (*(*l_element_courant).donnee).objet)).thread)
  458:                                 .tid);
  459:                     }
  460:                 }
  461:             }
  462: 
  463:             if ((*s_etat_processus).var_volatile_alarme != 0)
  464:             {
  465:                 if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
  466:                         (*(*l_element_courant).donnee).objet)).thread).mutex))
  467:                         != 0)
  468:                 {
  469:                     pthread_mutex_unlock(&((*s_etat_processus)
  470:                             .mutex_pile_processus));
  471:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  472: 
  473:                     pthread_mutex_lock(&((*s_argument_thread).mutex));
  474:                     pthread_mutex_unlock(&((*s_argument_thread).mutex));
  475: 
  476:                     (*s_argument_thread).thread_actif = d_faux;
  477: 
  478:                     pthread_exit(NULL);
  479:                 }
  480: 
  481:                 if ((*(*((struct_processus_fils *)
  482:                         (*(*l_element_courant).donnee).objet)).thread)
  483:                         .thread_actif == d_vrai)
  484:                 {
  485:                     envoi_signal_thread((*(*((struct_processus_fils *)
  486:                             (*(*l_element_courant).donnee).objet)).thread).tid,
  487:                             rpl_sigurg);
  488:                 }
  489: 
  490:                 if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
  491:                         (*(*l_element_courant).donnee).objet)).thread)
  492:                         .mutex)) != 0)
  493:                 {
  494:                     pthread_mutex_unlock(&((*s_etat_processus)
  495:                             .mutex_pile_processus));
  496:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  497: 
  498:                     pthread_mutex_lock(&((*s_argument_thread).mutex));
  499:                     pthread_mutex_unlock(&((*s_argument_thread).mutex));
  500: 
  501:                     (*s_argument_thread).thread_actif = d_faux;
  502: 
  503:                     pthread_exit(NULL);
  504:                 }
  505:             }
  506:             else
  507:             {
  508:                 if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
  509:                         (*(*l_element_courant).donnee).objet)).thread).mutex))
  510:                         != 0)
  511:                 {
  512:                     pthread_mutex_unlock(&((*s_etat_processus)
  513:                             .mutex_pile_processus));
  514:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  515: 
  516:                     pthread_mutex_lock(&((*s_argument_thread).mutex));
  517:                     pthread_mutex_unlock(&((*s_argument_thread).mutex));
  518: 
  519:                     (*s_argument_thread).thread_actif = d_faux;
  520: 
  521:                     pthread_exit(NULL);
  522:                 }
  523: 
  524:                 if ((*(*((struct_processus_fils *)
  525:                         (*(*l_element_courant).donnee).objet)).thread)
  526:                         .thread_actif == d_vrai)
  527:                 {
  528:                     if ((*s_etat_processus).arret_depuis_abort == -1)
  529:                     {
  530:                         envoi_signal_thread((*(*((struct_processus_fils *)
  531:                                 (*(*l_element_courant).donnee).objet)).thread)
  532:                                 .tid, rpl_sigabort);
  533:                     }
  534:                     else
  535:                     {
  536:                         envoi_signal_thread((*(*((struct_processus_fils *)
  537:                                 (*(*l_element_courant).donnee).objet)).thread)
  538:                                 .tid, rpl_sigstop);
  539:                     }
  540:                 }
  541: 
  542:                 if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
  543:                         (*(*l_element_courant).donnee).objet)).thread).mutex))
  544:                         != 0)
  545:                 {
  546:                     pthread_mutex_unlock(&((*s_etat_processus)
  547:                             .mutex_pile_processus));
  548:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  549: 
  550:                     pthread_mutex_lock(&((*s_argument_thread).mutex));
  551:                     pthread_mutex_unlock(&((*s_argument_thread).mutex));
  552: 
  553:                     (*s_argument_thread).thread_actif = d_faux;
  554: 
  555:                     pthread_exit(NULL);
  556:                 }
  557:             }
  558:         }
  559: 
  560:         l_element_courant = (*l_element_courant).suivant;
  561:     }
  562: 
  563:     /*
  564:      * Attente de la fin de tous les processus fils
  565:      */
  566: 
  567:     for(i = 0; i < d_NOMBRE_INTERRUPTIONS;
  568:             (*s_etat_processus).masque_interruptions[i++] = 'I');
  569: 
  570:     attente.tv_sec = 0;
  571:     attente.tv_nsec = GRANULARITE_us * 1000;
  572: 
  573:     while((*s_etat_processus).l_base_pile_processus != NULL)
  574:     {
  575:         status = 0;
  576: 
  577:         l_element_courant = (struct_liste_chainee *)
  578:                 (*s_etat_processus).l_base_pile_processus;
  579: 
  580:         registre_stop = (*s_etat_processus)
  581:                 .var_volatile_traitement_retarde_stop;
  582:         (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
  583: 
  584:         for(i = 0; i < (*(*((struct_processus_fils *)
  585:                 (*(*l_element_courant).donnee).objet)).thread)
  586:                 .nombre_objets_dans_pipe; i++)
  587:         {
  588:             if ((s_objet_temporaire = lecture_pipe(s_etat_processus,
  589:                     (*(*((struct_processus_fils *) (*(*l_element_courant)
  590:                     .donnee).objet)).thread).pipe_objets[0])) != NULL)
  591:             {
  592:                 liberation(s_etat_processus, s_objet_temporaire);
  593: 
  594:                 (*(*((struct_processus_fils *) (*(*l_element_courant)
  595:                         .donnee).objet)).thread).nombre_objets_dans_pipe--;
  596: 
  597:                 action.sa_handler = SIG_IGN;
  598:                 action.sa_flags = SA_ONSTACK;
  599: 
  600:                 if (sigaction(SIGPIPE, &action, &registre) != 0)
  601:                 {
  602:                     pthread_mutex_unlock(&((*s_etat_processus)
  603:                             .mutex_pile_processus));
  604: 
  605:                     if (registre_stop == 0)
  606:                     {
  607:                         if ((*s_etat_processus)
  608:                                 .var_volatile_traitement_retarde_stop
  609:                                 == -1)
  610:                         {
  611:                             (*s_etat_processus)
  612:                                     .var_volatile_requete_arret = -1;
  613:                         }
  614: 
  615:                         (*s_etat_processus)
  616:                                 .var_volatile_traitement_retarde_stop =
  617:                                 registre_stop;
  618:                     }
  619: 
  620:                     (*s_etat_processus).erreur_systeme = d_es_signal;
  621:                     exit(EXIT_FAILURE);
  622:                 }
  623: 
  624:                 while((longueur_ecriture = write_atomic(
  625:                         s_etat_processus, (*(*((struct_processus_fils *)
  626:                         (*(*l_element_courant).donnee).objet)).thread)
  627:                         .pipe_nombre_injections[1], "+",
  628:                         sizeof(unsigned char))) !=
  629:                         sizeof(unsigned char))
  630:                 {
  631:                     if (longueur_ecriture == -1)
  632:                     {
  633:                         // Le processus n'existe plus.
  634:                         break;
  635:                     }
  636:                 }
  637: 
  638:                 if (registre_stop == 0)
  639:                 {
  640:                     if ((*s_etat_processus)
  641:                             .var_volatile_traitement_retarde_stop == -1)
  642:                     {
  643:                         (*s_etat_processus).var_volatile_requete_arret
  644:                                 = -1;
  645:                     }
  646: 
  647:                     (*s_etat_processus)
  648:                             .var_volatile_traitement_retarde_stop =
  649:                             registre_stop;
  650:                 }
  651: 
  652:                 if (sigaction(SIGPIPE, &registre, NULL) != 0)
  653:                 {
  654:                     pthread_mutex_unlock(&((*s_etat_processus)
  655:                             .mutex_pile_processus));
  656: 
  657:                     (*s_etat_processus).erreur_systeme = d_es_signal;
  658:                     exit(EXIT_FAILURE);
  659:                 }
  660:             }
  661:         }
  662: 
  663:         if ((*(*((struct_processus_fils *) (*(*l_element_courant)
  664:                 .donnee).objet)).thread).processus_detache == d_vrai)
  665:         {
  666:             if (waitpid((*(*((struct_processus_fils *)
  667:                     (*(*l_element_courant).donnee).objet)).thread).pid,
  668:                     &status, WNOHANG) < 0)
  669:             {
  670:             }
  671:         }
  672: 
  673:         if (pthread_mutex_lock(&((*s_etat_processus).mutex_interruptions)) != 0)
  674:         {
  675:             pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
  676: 
  677:             (*s_etat_processus).erreur_systeme = d_es_processus;
  678:             exit(EXIT_FAILURE);
  679:         }
  680: 
  681:         if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)
  682:         {
  683:             affectation_interruptions_logicielles(s_etat_processus);
  684:         }
  685: 
  686:         if (pthread_mutex_unlock(&((*s_etat_processus).mutex_interruptions))
  687:                 != 0)
  688:         {
  689:             pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
  690: 
  691:             (*s_etat_processus).erreur_systeme = d_es_processus;
  692:             exit(EXIT_FAILURE);
  693:         }
  694: 
  695:         pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
  696:         nanosleep(&attente, NULL);
  697:         pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus));
  698:     }
  699: 
  700:     pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
  701: 
  702:     l_element_courant = (*s_etat_processus).s_sockets;
  703: 
  704:     while(l_element_courant != NULL)
  705:     {
  706:         l_element_suivant = (*l_element_courant).suivant;
  707: 
  708:         /*
  709:          * Fermeture des sockets créées dans le processus courant.
  710:          */
  711: 
  712:         if (((*((struct_socket *) (*(*l_element_courant).donnee).objet))
  713:                 .pid == getpid()) && (pthread_equal((*((struct_socket *)
  714:                 (*(*l_element_courant).donnee).objet)).tid, pthread_self())
  715:                 != 0))
  716:         {
  717:             if ((*((struct_socket *) (*(*l_element_courant).donnee).objet))
  718:                     .socket_connectee == d_vrai)
  719:             {
  720:                 shutdown((*((struct_socket *) (*(*l_element_courant).donnee)
  721:                         .objet)).socket, SHUT_RDWR);
  722:             }
  723: 
  724:             close((*((struct_socket *) (*(*l_element_courant).donnee).objet))
  725:                     .socket);
  726: 
  727:             if ((*((struct_socket *) (*(*l_element_courant).donnee).objet))
  728:                     .effacement == 'Y')
  729:             {
  730:                 unlink((*((struct_socket *) (*(*l_element_courant).donnee)
  731:                         .objet)).adresse);
  732:             }
  733:         }
  734: 
  735:         liberation(s_etat_processus, (*((struct_liste_chainee *)
  736:                 l_element_courant)).donnee);
  737:         free(l_element_courant);
  738: 
  739:         l_element_courant = l_element_suivant;
  740:     }
  741: 
  742:     l_element_courant = (*s_etat_processus).s_connecteurs_sql;
  743: 
  744:     while(l_element_courant != NULL)
  745:     {
  746:         l_element_suivant = (*l_element_courant).suivant;
  747: 
  748:         /*
  749:          * Fermeture des connecteurs créés dans le processus courant.
  750:          */
  751: 
  752:         if (((*((struct_socket *) (*(*l_element_courant).donnee).objet))
  753:                 .pid == getpid()) && (pthread_equal((*((struct_socket *)
  754:                 (*(*l_element_courant).donnee).objet)).tid, pthread_self())
  755:                 != 0))
  756:         {
  757:             sqlclose((*l_element_courant).donnee);
  758:         }
  759: 
  760:         liberation(s_etat_processus, (*((struct_liste_chainee *)
  761:                 l_element_courant)).donnee);
  762:         free(l_element_courant);
  763: 
  764:         l_element_courant = l_element_suivant;
  765:     }
  766: 
  767:     if ((((*s_etat_processus).erreur_execution != d_ex) ||
  768:             ((*s_etat_processus).exception != d_ep) ||
  769:             ((*s_etat_processus).erreur_systeme != d_es)) &&
  770:             ((*s_etat_processus).var_volatile_traitement_sigint == 0))
  771:     {
  772:         printf("%s [%d]\n", message =
  773:                 messages(s_etat_processus), (int) getpid());
  774:         free(message);
  775: 
  776:         if ((*s_etat_processus).core == d_vrai)
  777:         {
  778:             printf("\n");
  779: 
  780:             if ((*s_etat_processus).langue == 'F')
  781:             {
  782:                  printf("+++Information : Génération du fichier rpl-core "
  783:                         "[%d]\n", (int) getpid());
  784:             }
  785:             else
  786:             {
  787:                 printf("+++Information : Writing rpl-core file [%d]\n",
  788:                         (int) getpid());
  789:             }
  790: 
  791:             rplcore(s_etat_processus);
  792: 
  793:             if ((*s_etat_processus).langue == 'F')
  794:             {
  795:                 printf("+++Information : Processus tracé [%d]\n",
  796:                         (int) getpid());
  797:             }
  798:             else
  799:             {
  800:                 printf("+++Information : Done [%d]\n", (int) getpid());
  801:             }
  802: 
  803:             printf("\n");
  804:             fflush(stdout);
  805:         }
  806:     }
  807: 
  808:     if ((*s_etat_processus).entree_standard != NULL)
  809:     {
  810:         pclose((*s_etat_processus).entree_standard);
  811:         (*s_etat_processus).entree_standard = NULL;
  812:     }
  813: 
  814:     if ((*s_etat_processus).fichiers_graphiques != NULL)
  815:     {
  816:         instruction_cllcd(s_etat_processus);
  817:     }
  818: 
  819:     liberation(s_etat_processus, (*s_etat_processus).indep);
  820:     liberation(s_etat_processus, (*s_etat_processus).depend);
  821: 
  822:     free((*s_etat_processus).label_x);
  823:     free((*s_etat_processus).label_y);
  824:     free((*s_etat_processus).label_z);
  825:     free((*s_etat_processus).titre);
  826:     free((*s_etat_processus).legende);
  827: 
  828:     liberation(s_etat_processus,
  829:             (*s_etat_processus).parametres_courbes_de_niveau);
  830: 
  831:     if ((*s_etat_processus).instruction_derniere_erreur != NULL)
  832:     {
  833:         free((*s_etat_processus).instruction_derniere_erreur);
  834:         (*s_etat_processus).instruction_derniere_erreur = NULL;
  835:     }
  836: 
  837:     liberation_arbre_variables(s_etat_processus,
  838:             (*s_etat_processus).s_arbre_variables, d_faux);
  839: 
  840:     l_element_statique_courant = (*s_etat_processus)
  841:             .l_liste_variables_statiques;
  842: 
  843:     while(l_element_statique_courant != NULL)
  844:     {
  845:         l_element_statique_suivant = (*l_element_statique_courant).suivant;
  846:         free(l_element_statique_courant);
  847:         l_element_statique_courant = l_element_statique_suivant;
  848:     }
  849: 
  850:     l_element_courant = (*s_etat_processus).l_base_pile;
  851:     while(l_element_courant != NULL)
  852:     {
  853:         l_element_suivant = (*l_element_courant).suivant;
  854: 
  855:         liberation(s_etat_processus, (*l_element_courant).donnee);
  856:         free(l_element_courant);
  857: 
  858:         l_element_courant = l_element_suivant;
  859:     }
  860: 
  861:     l_element_courant = (*s_etat_processus).l_base_pile_last;
  862:     while(l_element_courant != NULL)
  863:     {
  864:         l_element_suivant = (*l_element_courant).suivant;
  865: 
  866:         liberation(s_etat_processus, (*l_element_courant).donnee);
  867:         free(l_element_courant);
  868: 
  869:         l_element_courant = l_element_suivant;
  870:     }
  871: 
  872:     l_element_courant = (*s_etat_processus).l_base_pile_contextes;
  873:     while(l_element_courant != NULL)
  874:     {
  875:         l_element_suivant = (*l_element_courant).suivant;
  876: 
  877:         liberation(s_etat_processus, (*l_element_courant).donnee);
  878:         free(l_element_courant);
  879: 
  880:         l_element_courant = l_element_suivant;
  881:     }
  882: 
  883:     l_element_courant = (*s_etat_processus).l_base_pile_taille_contextes;
  884:     while(l_element_courant != NULL)
  885:     {
  886:         l_element_suivant = (*l_element_courant).suivant;
  887: 
  888:         liberation(s_etat_processus, (*l_element_courant).donnee);
  889:         free(l_element_courant);
  890: 
  891:         l_element_courant = l_element_suivant;
  892:     }
  893: 
  894:     l_element_courant = (struct_liste_chainee *)
  895:             (*s_etat_processus).l_base_pile_systeme;
  896:     while(l_element_courant != NULL)
  897:     {
  898:         l_element_suivant = (struct_liste_chainee *)
  899:                 (*((struct_liste_pile_systeme *)
  900:                 l_element_courant)).suivant;
  901: 
  902:         liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
  903:                 l_element_courant)).indice_boucle);
  904:         liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
  905:                 l_element_courant)).limite_indice_boucle);
  906:         liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
  907:                 l_element_courant)).objet_de_test);
  908: 
  909:         if ((*((struct_liste_pile_systeme *)
  910:                 l_element_courant)).nom_variable != NULL)
  911:         {
  912:             free((*((struct_liste_pile_systeme *)
  913:                     l_element_courant)).nom_variable);
  914:         }
  915: 
  916:         free((struct_liste_pile_systeme *) l_element_courant);
  917: 
  918:         l_element_courant = l_element_suivant;
  919:     }
  920: 
  921:     l_element_courant = (*s_etat_processus).s_bibliotheques;
  922: 
  923:     while(l_element_courant != NULL)
  924:     {
  925:         l_element_suivant = (*l_element_courant).suivant;
  926: 
  927:         free((*((struct_bibliotheque *) (*l_element_courant).donnee)).nom);
  928: 
  929:         if (((*((struct_bibliotheque *) (*l_element_courant).donnee)).pid
  930:                 == getpid()) && (pthread_equal((*((struct_bibliotheque *)
  931:                 (*l_element_courant).donnee)).tid, pthread_self()) != 0))
  932:         {
  933:             dlclose((*((struct_bibliotheque *) (*l_element_courant).donnee))
  934:                     .descripteur);
  935:         }
  936: 
  937:         free((*l_element_courant).donnee);
  938:         free(l_element_courant);
  939: 
  940:         l_element_courant = l_element_suivant;
  941:     }
  942: 
  943:     for(i = 0; i < (*s_etat_processus).nombre_instructions_externes; i++)
  944:     {
  945:         free((*s_etat_processus).s_instructions_externes[i].nom);
  946:         free((*s_etat_processus).s_instructions_externes[i]
  947:                 .nom_bibliotheque);
  948:     }
  949: 
  950:     if ((*s_etat_processus).nombre_instructions_externes != 0)
  951:     {
  952:         free((*s_etat_processus).s_instructions_externes);
  953:     }
  954: 
  955:     if ((*s_etat_processus).debug == d_vrai)
  956:         if (((*s_etat_processus).type_debug & d_debug_processus) != 0)
  957:     {
  958:         if ((*s_etat_processus).langue == 'F')
  959:         {
  960:             printf("[%d] Fin du thread %llu\n", (int) getpid(),
  961:                     (unsigned long long) pthread_self());
  962:         }
  963:         else
  964:         {
  965:             printf("[%d] End of thread %llu\n", (int) getpid(),
  966:                     (unsigned long long) pthread_self());
  967:         }
  968: 
  969:         fflush(stdout);
  970:     }
  971: 
  972:     liberation(s_etat_processus, (*s_argument_thread).argument);
  973:     liberation(s_etat_processus, (*s_etat_processus).at_exit);
  974:     liberation(s_etat_processus, (*s_etat_processus).at_poke);
  975: 
  976:     for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)
  977:     {
  978:         liberation(s_etat_processus,
  979:                 (*s_etat_processus).corps_interruptions[i]);
  980: 
  981:         l_element_courant = (*s_etat_processus)
  982:                 .pile_origine_interruptions[i];
  983: 
  984:         while(l_element_courant != NULL)
  985:         {
  986:             l_element_suivant = (*l_element_courant).suivant;
  987: 
  988:             liberation(s_etat_processus, (*l_element_courant).donnee);
  989:             free(l_element_courant);
  990: 
  991:             l_element_courant = l_element_suivant;
  992:         }
  993:     }
  994: 
  995:     l_element_courant = (struct_liste_chainee *) (*s_etat_processus).s_marques;
  996: 
  997:     while(l_element_courant != NULL)
  998:     {
  999:         free((*((struct_marque *) l_element_courant)).label);
 1000:         free((*((struct_marque *) l_element_courant)).position);
 1001:         l_element_suivant = (struct_liste_chainee *)
 1002:                 (*((struct_marque *) l_element_courant)).suivant;
 1003:         free((struct_marque *) l_element_courant);
 1004:         l_element_courant = l_element_suivant;
 1005:     }
 1006: 
 1007:     if ((*s_etat_processus).generateur_aleatoire != NULL)
 1008:     {
 1009:         liberation_generateur_aleatoire(s_etat_processus);
 1010:     }
 1011: 
 1012:     if ((*s_etat_processus).profilage == d_vrai)
 1013:     {
 1014:         ecriture_profil(s_etat_processus);
 1015:         liberation_profil(s_etat_processus);
 1016:     }
 1017: 
 1018:     retrait_thread(s_etat_processus);
 1019:     pthread_mutex_destroy(&((*s_etat_processus).mutex_pile_processus));
 1020:     pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation));
 1021:     pthread_mutex_destroy(&((*s_etat_processus).mutex_interruptions));
 1022:     pthread_mutex_destroy(&((*s_etat_processus).mutex_signaux));
 1023: 
 1024: #   ifndef SEMAPHORES_NOMMES
 1025:         sem_destroy(&((*s_etat_processus).semaphore_fork));
 1026: #   else
 1027:         sem_destroy3((*s_etat_processus).semaphore_fork, getpid(),
 1028:                 pthread_self(), SEM_FORK);
 1029: #   endif
 1030: 
 1031:     liberation_contexte_cas(s_etat_processus);
 1032:     free((*s_etat_processus).localisation);
 1033:     liberation_allocateur(s_etat_processus);
 1034:     liberation_allocateur_buffer(s_etat_processus);
 1035:     pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation_buffer));
 1036:     sys_free(s_etat_processus);
 1037: 
 1038:     pthread_mutex_lock(&((*s_argument_thread).mutex));
 1039:     (*s_argument_thread).thread_actif = d_faux;
 1040:     pthread_mutex_unlock(&((*s_argument_thread).mutex));
 1041: 
 1042:     pthread_exit(NULL);
 1043:     return(NULL);
 1044: }
 1045: 
 1046: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>