File:  [local] / rpl / src / gestion_threads.c
Revision 1.54: download - view: text, annotated - select for diffs - revision graph
Tue Sep 20 15:45:53 2011 UTC (12 years, 7 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Suite des patches pour MacOS X.

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

CVSweb interface <joel.bertrand@systella.fr>