File:  [local] / rpl / src / gestion_threads.c
Revision 1.50: download - view: text, annotated - select for diffs - revision graph
Wed Sep 14 14:34:28 2011 UTC (12 years, 7 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Première série de patches pour rendre la gestion des signaux propre.

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

CVSweb interface <joel.bertrand@systella.fr>