File:  [local] / rpl / src / gestion_threads.c
Revision 1.3: download - view: text, annotated - select for diffs - revision graph
Wed Feb 10 10:14:20 2010 UTC (14 years, 2 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_0_11, HEAD
Branchement vers 4.0.11

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

CVSweb interface <joel.bertrand@systella.fr>