File:  [local] / rpl / src / gestion_threads.c
Revision 1.51: download - view: text, annotated - select for diffs - revision graph
Wed Sep 14 17:55:59 2011 UTC (12 years, 7 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Suite des patches...

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

CVSweb interface <joel.bertrand@systella.fr>