File:  [local] / rpl / src / gestion_threads.c
Revision 1.9: download - view: text, annotated - select for diffs - revision graph
Wed Apr 21 13:45:45 2010 UTC (14 years ago) by bertrand
Branches: MAIN
CVS tags: HEAD
En route pour la 4.0.15 !

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

CVSweb interface <joel.bertrand@systella.fr>