File:  [local] / rpl / src / gestion_threads.c
Revision 1.5: download - view: text, annotated - select for diffs - revision graph
Sat Mar 6 18:29:06 2010 UTC (14 years, 2 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Tous les noms de fichiers sont maintenant en UTF-8. Le contenu
des fichiers formatés est converti en UTF-8. Ces modifications sont
faites pour avoir un fonctionnement cohérent avec la bibliothèque sqlite.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.12
    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_c);
  406: 
  407:             if ((*((struct_descripteur_fichier *)
  408:                     (*l_element_courant).donnee)).type != 'C')
  409:             {
  410:                 sqlite3_close((*((struct_descripteur_fichier *)
  411:                         (*l_element_courant).donnee)).descripteur_sqlite);
  412:             }
  413: 
  414:             if ((*((struct_descripteur_fichier *) (*l_element_courant)
  415:                     .donnee)).effacement == 'Y')
  416:             {
  417:                 unlink((*((struct_descripteur_fichier *)
  418:                         (*l_element_courant).donnee)).nom);
  419:             }
  420:         }
  421: 
  422:         free((*((struct_descripteur_fichier *) (*l_element_courant)
  423:                 .donnee)).nom);
  424:         free((struct_descripteur_fichier *) (*l_element_courant).donnee);
  425:         free(l_element_courant);
  426: 
  427:         l_element_courant = l_element_suivant;
  428:     }
  429: 
  430:     pthread_mutex_lock(&((*s_etat_processus).mutex));
  431: 
  432:     l_element_courant = (struct_liste_chainee *)
  433:             (*s_etat_processus).l_base_pile_processus;
  434: 
  435:     while(l_element_courant != NULL)
  436:     {
  437:         if ((*(*((struct_processus_fils *) (*(*l_element_courant).donnee)
  438:                 .objet)).thread).processus_detache == d_vrai)
  439:         {
  440:             if ((*s_etat_processus).debug == d_vrai)
  441:             {
  442:                 if (((*s_etat_processus).type_debug & d_debug_processus) != 0)
  443:                 {
  444:                     if ((*s_etat_processus).langue == 'F')
  445:                     {
  446:                         printf("[%d] Signalement pour arrêt du processus %d\n",
  447:                                 (int) getpid(),
  448:                                 (int) (*(*((struct_processus_fils *)
  449:                                 (*(*l_element_courant).donnee).objet)).thread)
  450:                                 .pid);
  451:                     }
  452:                     else
  453:                     {
  454:                         printf("[%d] Send stop signal to process %d\n",
  455:                                 (int) getpid(),
  456:                                 (int) (*(*((struct_processus_fils *)
  457:                                 (*(*l_element_courant).donnee).objet)).thread)
  458:                                 .pid);
  459:                     }
  460:                 }
  461:             }
  462: 
  463:             if ((*s_etat_processus).var_volatile_alarme != 0)
  464:             {
  465:                 kill((*(*((struct_processus_fils *) (*(*l_element_courant)
  466:                         .donnee).objet)).thread).pid, SIGURG);
  467:             }
  468:             else
  469:             {
  470:                 kill((*(*((struct_processus_fils *) (*(*l_element_courant)
  471:                         .donnee).objet)).thread).pid, SIGFSTOP);
  472:             }
  473:         }
  474:         else
  475:         {
  476:             if ((*s_etat_processus).debug == d_vrai)
  477:             {
  478:                 if (((*s_etat_processus).type_debug & d_debug_processus) != 0)
  479:                 {
  480:                     if ((*s_etat_processus).langue == 'F')
  481:                     {
  482:                         printf("[%d] Signalement pour arrêt du thread %llu\n",
  483:                                 (int) getpid(), (unsigned long long)
  484:                                 (*(*((struct_processus_fils *)
  485:                                 (*(*l_element_courant).donnee).objet)).thread)
  486:                                 .tid);
  487:                     }
  488:                     else
  489:                     {
  490:                         printf("[%d] Send stop signal to thread %llu\n",
  491:                                 (int) getpid(), (unsigned long long)
  492:                                 (*(*((struct_processus_fils *)
  493:                                 (*(*l_element_courant).donnee).objet)).thread)
  494:                                 .tid);
  495:                     }
  496:                 }
  497:             }
  498: 
  499:             if ((*s_etat_processus).var_volatile_alarme != 0)
  500:             {
  501:                 if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
  502:                         (*(*l_element_courant).donnee).objet)).thread).mutex))
  503:                         != 0)
  504:                 {
  505:                     pthread_mutex_unlock(&((*s_etat_processus).mutex));
  506:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  507: 
  508:                     pthread_mutex_lock(&((*s_argument_thread).mutex));
  509:                     pthread_mutex_unlock(&((*s_argument_thread).mutex));
  510: 
  511:                     (*s_argument_thread).thread_actif = d_faux;
  512: 
  513:                     pthread_exit(NULL);
  514:                 }
  515: 
  516:                 if ((*(*((struct_processus_fils *)
  517:                         (*(*l_element_courant).donnee).objet)).thread)
  518:                         .thread_actif == d_vrai)
  519:                 {
  520:                     pthread_kill((*(*((struct_processus_fils *)
  521:                             (*(*l_element_courant).donnee).objet)).thread).tid,
  522:                             SIGURG);
  523:                 }
  524: 
  525:                 if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
  526:                         (*(*l_element_courant).donnee).objet)).thread)
  527:                         .mutex)) != 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:             else
  541:             {
  542:                 if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
  543:                         (*(*l_element_courant).donnee).objet)).thread).mutex))
  544:                         != 0)
  545:                 {
  546:                     pthread_mutex_unlock(&((*s_etat_processus).mutex));
  547:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  548: 
  549:                     pthread_mutex_lock(&((*s_argument_thread).mutex));
  550:                     pthread_mutex_unlock(&((*s_argument_thread).mutex));
  551: 
  552:                     (*s_argument_thread).thread_actif = d_faux;
  553: 
  554:                     pthread_exit(NULL);
  555:                 }
  556: 
  557:                 if ((*(*((struct_processus_fils *)
  558:                         (*(*l_element_courant).donnee).objet)).thread)
  559:                         .thread_actif == d_vrai)
  560:                 {
  561:                     pthread_kill((*(*((struct_processus_fils *)
  562:                             (*(*l_element_courant).donnee).objet)).thread).tid,
  563:                             SIGFSTOP);
  564:                 }
  565: 
  566:                 if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
  567:                         (*(*l_element_courant).donnee).objet)).thread).mutex))
  568:                         != 0)
  569:                 {
  570:                     pthread_mutex_unlock(&((*s_etat_processus).mutex));
  571:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  572: 
  573:                     pthread_mutex_lock(&((*s_argument_thread).mutex));
  574:                     pthread_mutex_unlock(&((*s_argument_thread).mutex));
  575: 
  576:                     (*s_argument_thread).thread_actif = d_faux;
  577: 
  578:                     pthread_exit(NULL);
  579:                 }
  580:             }
  581:         }
  582: 
  583:         l_element_courant = (*l_element_courant).suivant;
  584:     }
  585: 
  586:     /*
  587:      * Attente de la fin de tous les processus fils
  588:      */
  589: 
  590:     for(i = 0; i < d_NOMBRE_INTERRUPTIONS;
  591:             (*s_etat_processus).masque_interruptions[i++] = 'I');
  592: 
  593:     attente.tv_sec = 0;
  594:     attente.tv_nsec = GRANULARITE_us * 1000;
  595: 
  596:     while((*s_etat_processus).l_base_pile_processus != NULL)
  597:     {
  598:         status = 0;
  599: 
  600:         l_element_courant = (struct_liste_chainee *)
  601:                 (*s_etat_processus).l_base_pile_processus;
  602: 
  603:         if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)
  604:         {
  605:             affectation_interruptions_logicielles(s_etat_processus);
  606:         }
  607: 
  608:         registre_stop = (*s_etat_processus)
  609:                 .var_volatile_traitement_retarde_stop;
  610:         (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
  611: 
  612:         for(i = 0; i < (unsigned long) (*(*((struct_processus_fils *)
  613:                 (*(*l_element_courant).donnee).objet)).thread)
  614:                 .nombre_objets_dans_pipe; i++)
  615:         {
  616:             if ((s_objet_temporaire = lecture_pipe(s_etat_processus,
  617:                     (*(*((struct_processus_fils *) (*(*l_element_courant)
  618:                     .donnee).objet)).thread).pipe_objets[0])) != NULL)
  619:             {
  620:                 liberation(s_etat_processus, s_objet_temporaire);
  621: 
  622:                 (*(*((struct_processus_fils *) (*(*l_element_courant)
  623:                         .donnee).objet)).thread).nombre_objets_dans_pipe--;
  624: 
  625:                 action.sa_handler = SIG_IGN;
  626:                 action.sa_flags = SA_ONSTACK;
  627: 
  628:                 if (sigaction(SIGPIPE, &action, &registre) != 0)
  629:                 {
  630:                     pthread_mutex_unlock(&((*s_etat_processus).mutex));
  631: 
  632:                     if (registre_stop == 0)
  633:                     {
  634:                         if ((*s_etat_processus)
  635:                                 .var_volatile_traitement_retarde_stop
  636:                                 == -1)
  637:                         {
  638:                             (*s_etat_processus)
  639:                                     .var_volatile_requete_arret = -1;
  640:                         }
  641: 
  642:                         (*s_etat_processus)
  643:                                 .var_volatile_traitement_retarde_stop =
  644:                                 registre_stop;
  645:                     }
  646: 
  647:                     (*s_etat_processus).erreur_systeme = d_es_signal;
  648:                     exit(EXIT_FAILURE);
  649:                 }
  650: 
  651:                 while((longueur_ecriture = write_atomic(
  652:                         s_etat_processus, (*(*((struct_processus_fils *)
  653:                         (*(*l_element_courant).donnee).objet)).thread)
  654:                         .pipe_nombre_injections[1], "+",
  655:                         sizeof(unsigned char))) !=
  656:                         sizeof(unsigned char))
  657:                 {
  658:                     if (longueur_ecriture == -1)
  659:                     {
  660:                         // Le processus n'existe plus.
  661:                         break;
  662:                     }
  663:                 }
  664: 
  665:                 if (registre_stop == 0)
  666:                 {
  667:                     if ((*s_etat_processus)
  668:                             .var_volatile_traitement_retarde_stop == -1)
  669:                     {
  670:                         (*s_etat_processus).var_volatile_requete_arret
  671:                                 = -1;
  672:                     }
  673: 
  674:                     (*s_etat_processus)
  675:                             .var_volatile_traitement_retarde_stop =
  676:                             registre_stop;
  677:                 }
  678: 
  679:                 if (sigaction(SIGPIPE, &registre, NULL) != 0)
  680:                 {
  681:                     pthread_mutex_unlock(&((*s_etat_processus).mutex));
  682: 
  683:                     (*s_etat_processus).erreur_systeme = d_es_signal;
  684:                     exit(EXIT_FAILURE);
  685:                 }
  686:             }
  687:         }
  688: 
  689:         if ((*(*((struct_processus_fils *) (*(*l_element_courant)
  690:                 .donnee).objet)).thread).processus_detache == d_vrai)
  691:         {
  692:             if (waitpid((*(*((struct_processus_fils *)
  693:                     (*(*l_element_courant).donnee).objet)).thread).pid,
  694:                     &status, WNOHANG) < 0)
  695:             {
  696:             }
  697:         }
  698: 
  699:         pthread_mutex_unlock(&((*s_etat_processus).mutex));
  700:         nanosleep(&attente, NULL);
  701:         pthread_mutex_lock(&((*s_etat_processus).mutex));
  702:     }
  703: 
  704:     pthread_mutex_unlock(&((*s_etat_processus).mutex));
  705: 
  706:     l_element_courant = (*s_etat_processus).s_sockets;
  707: 
  708:     while(l_element_courant != NULL)
  709:     {
  710:         l_element_suivant = (*l_element_courant).suivant;
  711: 
  712:         /*
  713:          * Fermeture des sockets créées 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:             if ((*((struct_socket *) (*(*l_element_courant).donnee).objet))
  722:                     .socket_connectee == d_vrai)
  723:             {
  724:                 shutdown((*((struct_socket *) (*(*l_element_courant).donnee)
  725:                         .objet)).socket, SHUT_RDWR);
  726:             }
  727: 
  728:             close((*((struct_socket *) (*(*l_element_courant).donnee).objet))
  729:                     .socket);
  730: 
  731:             if ((*((struct_socket *) (*(*l_element_courant).donnee).objet))
  732:                     .effacement == 'Y')
  733:             {
  734:                 unlink((*((struct_socket *) (*(*l_element_courant).donnee)
  735:                         .objet)).adresse);
  736:             }
  737:         }
  738: 
  739:         liberation(s_etat_processus, (*((struct_liste_chainee *)
  740:                 l_element_courant)).donnee);
  741:         free(l_element_courant);
  742: 
  743:         l_element_courant = l_element_suivant;
  744:     }
  745: 
  746:     l_element_courant = (*s_etat_processus).s_connecteurs_sql;
  747: 
  748:     while(l_element_courant != NULL)
  749:     {
  750:         l_element_suivant = (*l_element_courant).suivant;
  751: 
  752:         /*
  753:          * Fermeture des connecteurs créés dans le processus courant.
  754:          */
  755: 
  756:         if (((*((struct_socket *) (*(*l_element_courant).donnee).objet))
  757:                 .pid == getpid()) && (pthread_equal((*((struct_socket *)
  758:                 (*(*l_element_courant).donnee).objet)).tid, pthread_self())
  759:                 != 0))
  760:         {
  761:             sqlclose((*l_element_courant).donnee);
  762:         }
  763: 
  764:         liberation(s_etat_processus, (*((struct_liste_chainee *)
  765:                 l_element_courant)).donnee);
  766:         free(l_element_courant);
  767: 
  768:         l_element_courant = l_element_suivant;
  769:     }
  770: 
  771:     if ((((*s_etat_processus).erreur_execution != d_ex) ||
  772:             ((*s_etat_processus).exception != d_ep) ||
  773:             ((*s_etat_processus).erreur_systeme != d_es)) &&
  774:             ((*s_etat_processus).var_volatile_traitement_sigint == 0))
  775:     {
  776:         printf("%s [%d]\n", message =
  777:                 messages(s_etat_processus), (int) getpid());
  778:         free(message);
  779: 
  780:         if ((*s_etat_processus).core == d_vrai)
  781:         {
  782:             printf("\n");
  783: 
  784:             if ((*s_etat_processus).langue == 'F')
  785:             {
  786:                  printf("+++Information : Génération du fichier rpl-core "
  787:                         "[%d]\n", (int) getpid());
  788:             }
  789:             else
  790:             {
  791:                 printf("+++Information : Writing rpl-core file [%d]\n",
  792:                         (int) getpid());
  793:             }
  794: 
  795:             rplcore(s_etat_processus);
  796: 
  797:             if ((*s_etat_processus).langue == 'F')
  798:             {
  799:                 printf("+++Information : Processus tracé [%d]\n",
  800:                         (int) getpid());
  801:             }
  802:             else
  803:             {
  804:                 printf("+++Information : Done [%d]\n", (int) getpid());
  805:             }
  806: 
  807:             printf("\n");
  808:             fflush(stdout);
  809:         }
  810:     }
  811: 
  812:     if ((*s_etat_processus).entree_standard != NULL)
  813:     {
  814:         pclose((*s_etat_processus).entree_standard);
  815:         (*s_etat_processus).entree_standard = NULL;
  816:     }
  817: 
  818:     if ((*s_etat_processus).fichiers_graphiques != NULL)
  819:     {
  820:         instruction_cllcd(s_etat_processus);
  821:     }
  822: 
  823:     liberation(s_etat_processus, (*s_etat_processus).indep);
  824:     liberation(s_etat_processus, (*s_etat_processus).depend);
  825: 
  826:     free((*s_etat_processus).label_x);
  827:     free((*s_etat_processus).label_y);
  828:     free((*s_etat_processus).label_z);
  829:     free((*s_etat_processus).titre);
  830:     free((*s_etat_processus).legende);
  831: 
  832:     liberation(s_etat_processus,
  833:             (*s_etat_processus).parametres_courbes_de_niveau);
  834: 
  835:     if ((*s_etat_processus).instruction_derniere_erreur != NULL)
  836:     {
  837:         free((*s_etat_processus).instruction_derniere_erreur);
  838:         (*s_etat_processus).instruction_derniere_erreur = NULL;
  839:     }
  840: 
  841:     for(i = 0; i < (*s_etat_processus).nombre_variables; i++)
  842:     {
  843:         // Les définitions ne sont pas libérées parce qu'elles sont partagées
  844:         // avec le thread père.
  845: 
  846:         if ((*s_etat_processus).s_liste_variables[i].niveau != 0)
  847:         {
  848:             liberation(s_etat_processus,
  849:                     (*s_etat_processus).s_liste_variables[i].objet);
  850:         }
  851: 
  852:         free((*s_etat_processus).s_liste_variables[i].nom);
  853:     }
  854: 
  855:     free((*s_etat_processus).s_liste_variables);
  856: 
  857:     for(i = 0; i < (*s_etat_processus).nombre_variables_statiques; i++)
  858:     {
  859:         liberation(s_etat_processus,
  860:                 (*s_etat_processus).s_liste_variables_statiques[i].objet);
  861:         free((*s_etat_processus).s_liste_variables_statiques[i].nom);
  862:     }
  863: 
  864:     free((*s_etat_processus).s_liste_variables_statiques);
  865: 
  866:     l_element_courant = (*s_etat_processus).l_base_pile;
  867:     while(l_element_courant != NULL)
  868:     {
  869:         l_element_suivant = (*l_element_courant).suivant;
  870: 
  871:         liberation(s_etat_processus, (*l_element_courant).donnee);
  872:         free(l_element_courant);
  873: 
  874:         l_element_courant = l_element_suivant;
  875:     }
  876: 
  877:     l_element_courant = (*s_etat_processus).l_base_pile_last;
  878:     while(l_element_courant != NULL)
  879:     {
  880:         l_element_suivant = (*l_element_courant).suivant;
  881: 
  882:         liberation(s_etat_processus, (*l_element_courant).donnee);
  883:         free(l_element_courant);
  884: 
  885:         l_element_courant = l_element_suivant;
  886:     }
  887: 
  888:     l_element_courant = (*s_etat_processus).l_base_pile_contextes;
  889:     while(l_element_courant != NULL)
  890:     {
  891:         l_element_suivant = (*l_element_courant).suivant;
  892: 
  893:         liberation(s_etat_processus, (*l_element_courant).donnee);
  894:         free(l_element_courant);
  895: 
  896:         l_element_courant = l_element_suivant;
  897:     }
  898: 
  899:     l_element_courant = (*s_etat_processus).l_base_pile_taille_contextes;
  900:     while(l_element_courant != NULL)
  901:     {
  902:         l_element_suivant = (*l_element_courant).suivant;
  903: 
  904:         liberation(s_etat_processus, (*l_element_courant).donnee);
  905:         free(l_element_courant);
  906: 
  907:         l_element_courant = l_element_suivant;
  908:     }
  909: 
  910:     l_element_courant = (struct_liste_chainee *)
  911:             (*s_etat_processus).l_base_pile_systeme;
  912:     while(l_element_courant != NULL)
  913:     {
  914:         l_element_suivant = (struct_liste_chainee *)
  915:                 (*((struct_liste_pile_systeme *)
  916:                 l_element_courant)).suivant;
  917: 
  918:         liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
  919:                 l_element_courant)).indice_boucle);
  920:         liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
  921:                 l_element_courant)).limite_indice_boucle);
  922:         liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
  923:                 l_element_courant)).objet_de_test);
  924: 
  925:         if ((*((struct_liste_pile_systeme *)
  926:                 l_element_courant)).nom_variable != NULL)
  927:         {
  928:             free((*((struct_liste_pile_systeme *)
  929:                     l_element_courant)).nom_variable);
  930:         }
  931: 
  932:         free((struct_liste_pile_systeme *) l_element_courant);
  933: 
  934:         l_element_courant = l_element_suivant;
  935:     }
  936: 
  937:     l_element_courant = (*s_etat_processus).s_bibliotheques;
  938: 
  939:     while(l_element_courant != NULL)
  940:     {
  941:         l_element_suivant = (*l_element_courant).suivant;
  942: 
  943:         free((*((struct_bibliotheque *) (*l_element_courant).donnee)).nom);
  944: 
  945:         if (((*((struct_bibliotheque *) (*l_element_courant).donnee)).pid
  946:                 == getpid()) && (pthread_equal((*((struct_bibliotheque *)
  947:                 (*l_element_courant).donnee)).tid, pthread_self()) != 0))
  948:         {
  949:             dlclose((*((struct_bibliotheque *) (*l_element_courant).donnee))
  950:                     .descripteur);
  951:         }
  952: 
  953:         free((*l_element_courant).donnee);
  954:         free(l_element_courant);
  955: 
  956:         l_element_courant = l_element_suivant;
  957:     }
  958: 
  959:     for(i = 0; i < (*s_etat_processus).nombre_instructions_externes; i++)
  960:     {
  961:         free((*s_etat_processus).s_instructions_externes[i].nom);
  962:         free((*s_etat_processus).s_instructions_externes[i]
  963:                 .nom_bibliotheque);
  964:     }
  965: 
  966:     if ((*s_etat_processus).nombre_instructions_externes != 0)
  967:     {
  968:         free((*s_etat_processus).s_instructions_externes);
  969:     }
  970: 
  971:     if ((*s_etat_processus).debug == d_vrai)
  972:         if (((*s_etat_processus).type_debug & d_debug_processus) != 0)
  973:     {
  974:         if ((*s_etat_processus).langue == 'F')
  975:         {
  976:             printf("[%d] Fin du thread %llu\n", (int) getpid(),
  977:                     (unsigned long long) pthread_self());
  978:         }
  979:         else
  980:         {
  981:             printf("[%d] End of thread %llu\n", (int) getpid(),
  982:                     (unsigned long long) pthread_self());
  983:         }
  984: 
  985:         fflush(stdout);
  986:     }
  987: 
  988:     liberation(s_etat_processus, (*s_argument_thread).argument);
  989: 
  990:     for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)
  991:     {
  992:         liberation(s_etat_processus,
  993:                 (*s_etat_processus).corps_interruptions[i]);
  994: 
  995:         l_element_courant = (*s_etat_processus)
  996:                 .pile_origine_interruptions[i];
  997: 
  998:         while(l_element_courant != NULL)
  999:         {
 1000:             l_element_suivant = (*l_element_courant).suivant;
 1001: 
 1002:             liberation(s_etat_processus, (*l_element_courant).donnee);
 1003:             free(l_element_courant);
 1004: 
 1005:             l_element_courant = l_element_suivant;
 1006:         }
 1007:     }
 1008: 
 1009:     l_element_courant = (struct_liste_chainee *) (*s_etat_processus).s_marques;
 1010: 
 1011:     while(l_element_courant != NULL)
 1012:     {
 1013:         free((*((struct_marque *) l_element_courant)).label);
 1014:         free((*((struct_marque *) l_element_courant)).position);
 1015:         l_element_suivant = (struct_liste_chainee *)
 1016:                 (*((struct_marque *) l_element_courant)).suivant;
 1017:         free((struct_marque *) l_element_courant);
 1018:         l_element_courant = l_element_suivant;
 1019:     }
 1020: 
 1021:     if ((*s_etat_processus).generateur_aleatoire != NULL)
 1022:     {
 1023:         liberation_generateur_aleatoire(s_etat_processus);
 1024:     }
 1025: 
 1026:     if ((*s_etat_processus).profilage == d_vrai)
 1027:     {
 1028:         ecriture_profil(s_etat_processus);
 1029:         liberation_profil(s_etat_processus);
 1030:     }
 1031: 
 1032:     liberation_allocateur(s_etat_processus);
 1033: 
 1034:     retrait_thread(s_etat_processus);
 1035:     pthread_mutex_destroy(&((*s_etat_processus).mutex));
 1036: 
 1037:     free((*s_etat_processus).localisation);
 1038:     free(s_etat_processus);
 1039: 
 1040:     pthread_mutex_lock(&((*s_argument_thread).mutex));
 1041:     pthread_mutex_unlock(&((*s_argument_thread).mutex));
 1042: 
 1043:     (*s_argument_thread).thread_actif = d_faux;
 1044:     pthread_exit(NULL);
 1045: }
 1046: 
 1047: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>