File:  [local] / rpl / src / gestion_threads.c
Revision 1.49: download - view: text, annotated - select for diffs - revision graph
Sat Sep 3 10:31:50 2011 UTC (12 years, 8 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Correction de la récupération du signal SIGSEGV.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.1.3
    4:   Copyright (C) 1989-2011 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #include "rpl-conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   Fonction de lancement d'un thread
   29: ================================================================================
   30:   Entrées : pointeur sur une structure
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void *
   39: lancement_thread(void *argument)
   40: {
   41:     int                         status;
   42: 
   43:     pid_t                       ppid;
   44: 
   45:     pthread_t                   tid_final;
   46: 
   47:     sig_atomic_t                registre_stop;
   48: 
   49:     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_etat_processus = (*s_argument_thread).s_nouvel_etat_processus;
   78:     (*s_argument_thread).tid = pthread_self();
   79:     (*s_argument_thread).thread_actif = d_vrai;
   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 (setjmp(contexte_thread) == 0)
  255:         {
  256:             if (evaluation(s_etat_processus, (*s_argument_thread).argument, 'E')
  257:                     == d_erreur)
  258:             {
  259:                 if (((*s_etat_processus).erreur_execution == d_ex) &&
  260:                         ((*s_etat_processus).erreur_systeme == d_es))
  261:                 {
  262:                     (*s_etat_processus).erreur_execution =
  263:                             d_ex_erreur_evaluation;
  264:                 }
  265:             }
  266:             else
  267:             {
  268:                 if (((*s_etat_processus).var_volatile_alarme == 0)
  269:                         && ((*s_etat_processus).arret_depuis_abort == 0)
  270:                         && ((*s_etat_processus).at_exit != NULL))
  271:                 {
  272:                     (*s_etat_processus).var_volatile_requete_arret = 0;
  273:                     (*s_etat_processus).var_volatile_traitement_retarde_stop =
  274:                             -1;
  275: 
  276:                     if (evaluation(s_etat_processus,
  277:                             (*s_etat_processus).at_exit, 'E') == d_erreur)
  278:                     {
  279:                         if (((*s_etat_processus).erreur_execution == d_ex) &&
  280:                                 ((*s_etat_processus).erreur_systeme == d_es))
  281:                         {
  282:                             (*s_etat_processus).erreur_execution =
  283:                                     d_ex_erreur_evaluation;
  284:                         }
  285:                     }
  286:                 }
  287:             }
  288:         }
  289: 
  290:         if ((*s_argument_thread).destruction_objet == d_vrai)
  291:         {
  292:             liberation(s_etat_processus, (*s_argument_thread).argument);
  293:         }
  294:     }
  295: 
  296:     if ((*s_etat_processus).presence_fusible == d_vrai)
  297:     {
  298:         pthread_cancel((*s_etat_processus).thread_fusible);
  299:     }
  300: 
  301:     tid_final = -2;
  302: 
  303:     while((longueur_ecriture = write_atomic(s_etat_processus,
  304:             (*s_argument_thread).pipe_nombre_interruptions_attente[1],
  305:             &tid_final, sizeof(tid_final))) != sizeof(tid_final))
  306:     {
  307:         if (longueur_ecriture == -1)
  308:         {
  309:             break;
  310:         }
  311:     }
  312: 
  313:     while((longueur_ecriture = write_atomic(s_etat_processus,
  314:             (*s_argument_thread).pipe_nombre_objets_attente[1],
  315:             &tid_final, sizeof(tid_final))) != sizeof(tid_final))
  316:     {
  317:         if (longueur_ecriture == -1)
  318:         {
  319:             break;
  320:         }
  321:     }
  322: 
  323:     if ((*s_etat_processus).var_volatile_processus_pere != 0)
  324:     {
  325:         // Racine des processus atteinte
  326: 
  327:         erreur = d_ex;
  328: 
  329:         while((longueur_ecriture = write_atomic(s_etat_processus,
  330:                 (*s_argument_thread).pipe_erreurs[1], &erreur,
  331:                 sizeof((*s_etat_processus).erreur_execution))) !=
  332:                 sizeof((*s_etat_processus).erreur_execution))
  333:         {
  334:             if (longueur_ecriture == -1)
  335:             {
  336:                 break;
  337:             }
  338:         }
  339:     }
  340:     else
  341:     {
  342:         while((longueur_ecriture = write_atomic(s_etat_processus,
  343:                 (*s_argument_thread).pipe_erreurs[1],
  344:                 &((*s_etat_processus).erreur_execution),
  345:                 sizeof((*s_etat_processus).erreur_execution))) !=
  346:                 sizeof((*s_etat_processus).erreur_execution))
  347:         {
  348:             if (longueur_ecriture == -1)
  349:             {
  350:                 break;
  351:             }
  352:         }
  353:     }
  354: 
  355:     if ((*s_etat_processus).var_volatile_processus_pere != 0)
  356:     {
  357:         // Racine des processus atteinte
  358: 
  359:         erreur = d_es;
  360: 
  361:         while((longueur_ecriture = write_atomic(s_etat_processus,
  362:                 (*s_argument_thread).pipe_erreurs[1], &erreur,
  363:                 sizeof((*s_etat_processus).erreur_systeme))) !=
  364:                 sizeof((*s_etat_processus).erreur_systeme))
  365:         {
  366:             if (longueur_ecriture == -1)
  367:             {
  368:                 break;
  369:             }
  370:         }
  371:     }
  372:     else
  373:     {
  374:         while((longueur_ecriture = write_atomic(s_etat_processus,
  375:                 (*s_argument_thread).pipe_erreurs[1],
  376:                 &((*s_etat_processus).erreur_systeme),
  377:                 sizeof((*s_etat_processus).erreur_systeme))) !=
  378:                 sizeof((*s_etat_processus).erreur_systeme))
  379:         {
  380:             if (longueur_ecriture == -1)
  381:             {
  382:                 break;
  383:             }
  384:         }
  385:     }
  386: 
  387:     if ((*s_etat_processus).pid_erreur_processus_fils == 0)
  388:     {
  389:         ppid = getpid();
  390: 
  391:         while((longueur_ecriture = write_atomic(s_etat_processus,
  392:                 (*s_argument_thread).pipe_erreurs[1],
  393:                 &ppid, sizeof(ppid))) != sizeof(ppid))
  394:         {
  395:             if (longueur_ecriture == -1)
  396:             {
  397:                 break;
  398:             }
  399:         }
  400:     }
  401:     else
  402:     {
  403:         while((longueur_ecriture = write_atomic(s_etat_processus,
  404:                 (*s_argument_thread).pipe_erreurs[1],
  405:                 &((*s_etat_processus).pid_erreur_processus_fils),
  406:                 sizeof((*s_etat_processus).pid_erreur_processus_fils))) !=
  407:                 sizeof((*s_etat_processus).pid_erreur_processus_fils))
  408:         {
  409:             if (longueur_ecriture == -1)
  410:             {
  411:                 break;
  412:             }
  413:         }
  414:     }
  415: 
  416:     close((*s_argument_thread).pipe_erreurs[1]);
  417:     close((*s_argument_thread).pipe_interruptions[1]);
  418:     close((*s_argument_thread).pipe_nombre_interruptions_attente[1]);
  419:     close((*s_argument_thread).pipe_objets[1]);
  420:     close((*s_argument_thread).pipe_nombre_objets_attente[1]);
  421:     close((*s_argument_thread).pipe_injections[0]);
  422:     close((*s_argument_thread).pipe_nombre_injections[0]);
  423:     close((*s_argument_thread).pipe_acquittement[0]);
  424: 
  425:     l_element_courant = (*s_etat_processus).s_fichiers;
  426: 
  427:     while(l_element_courant != NULL)
  428:     {
  429:         l_element_suivant = (*l_element_courant).suivant;
  430: 
  431:         if ((*((struct_descripteur_fichier *) (*l_element_courant)
  432:                 .donnee)).pid == getpid())
  433:         {
  434:             fclose((*((struct_descripteur_fichier *)
  435:                     (*l_element_courant).donnee)).descripteur_c);
  436: 
  437:             if ((*((struct_descripteur_fichier *)
  438:                     (*l_element_courant).donnee)).type != 'C')
  439:             {
  440:                 sqlite3_close((*((struct_descripteur_fichier *)
  441:                         (*l_element_courant).donnee)).descripteur_sqlite);
  442:             }
  443: 
  444:             if ((*((struct_descripteur_fichier *) (*l_element_courant)
  445:                     .donnee)).effacement == 'Y')
  446:             {
  447:                 unlink((*((struct_descripteur_fichier *)
  448:                         (*l_element_courant).donnee)).nom);
  449:             }
  450:         }
  451: 
  452:         free((*((struct_descripteur_fichier *) (*l_element_courant)
  453:                 .donnee)).nom);
  454:         free((struct_descripteur_fichier *) (*l_element_courant).donnee);
  455:         free(l_element_courant);
  456: 
  457:         l_element_courant = l_element_suivant;
  458:     }
  459: 
  460:     pthread_mutex_lock(&((*s_etat_processus).mutex));
  461: 
  462:     l_element_courant = (struct_liste_chainee *)
  463:             (*s_etat_processus).l_base_pile_processus;
  464: 
  465:     while(l_element_courant != NULL)
  466:     {
  467:         if ((*(*((struct_processus_fils *) (*(*l_element_courant).donnee)
  468:                 .objet)).thread).processus_detache == d_vrai)
  469:         {
  470:             if ((*s_etat_processus).debug == d_vrai)
  471:             {
  472:                 if (((*s_etat_processus).type_debug & d_debug_processus) != 0)
  473:                 {
  474:                     if ((*s_etat_processus).langue == 'F')
  475:                     {
  476:                         printf("[%d] Signalement pour arrêt du processus %d\n",
  477:                                 (int) getpid(),
  478:                                 (int) (*(*((struct_processus_fils *)
  479:                                 (*(*l_element_courant).donnee).objet)).thread)
  480:                                 .pid);
  481:                     }
  482:                     else
  483:                     {
  484:                         printf("[%d] Send stop signal to process %d\n",
  485:                                 (int) getpid(),
  486:                                 (int) (*(*((struct_processus_fils *)
  487:                                 (*(*l_element_courant).donnee).objet)).thread)
  488:                                 .pid);
  489:                     }
  490:                 }
  491:             }
  492: 
  493:             if ((*s_etat_processus).var_volatile_alarme != 0)
  494:             {
  495:                 kill((*(*((struct_processus_fils *) (*(*l_element_courant)
  496:                         .donnee).objet)).thread).pid, SIGURG);
  497:             }
  498:             else
  499:             {
  500:                 if ((*s_etat_processus).arret_depuis_abort == -1)
  501:                 {
  502:                     kill((*(*((struct_processus_fils *) (*(*l_element_courant)
  503:                             .donnee).objet)).thread).pid, SIGFABORT);
  504:                 }
  505:                 else
  506:                 {
  507:                     kill((*(*((struct_processus_fils *) (*(*l_element_courant)
  508:                             .donnee).objet)).thread).pid, SIGFSTOP);
  509:                 }
  510:             }
  511:         }
  512:         else
  513:         {
  514:             if ((*s_etat_processus).debug == d_vrai)
  515:             {
  516:                 if (((*s_etat_processus).type_debug & d_debug_processus) != 0)
  517:                 {
  518:                     if ((*s_etat_processus).langue == 'F')
  519:                     {
  520:                         printf("[%d] Signalement pour arrêt du thread %llu\n",
  521:                                 (int) getpid(), (unsigned long long)
  522:                                 (*(*((struct_processus_fils *)
  523:                                 (*(*l_element_courant).donnee).objet)).thread)
  524:                                 .tid);
  525:                     }
  526:                     else
  527:                     {
  528:                         printf("[%d] Send stop signal to thread %llu\n",
  529:                                 (int) getpid(), (unsigned long long)
  530:                                 (*(*((struct_processus_fils *)
  531:                                 (*(*l_element_courant).donnee).objet)).thread)
  532:                                 .tid);
  533:                     }
  534:                 }
  535:             }
  536: 
  537:             if ((*s_etat_processus).var_volatile_alarme != 0)
  538:             {
  539:                 if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
  540:                         (*(*l_element_courant).donnee).objet)).thread).mutex))
  541:                         != 0)
  542:                 {
  543:                     pthread_mutex_unlock(&((*s_etat_processus).mutex));
  544:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  545: 
  546:                     pthread_mutex_lock(&((*s_argument_thread).mutex));
  547:                     pthread_mutex_unlock(&((*s_argument_thread).mutex));
  548: 
  549:                     (*s_argument_thread).thread_actif = d_faux;
  550: 
  551:                     pthread_exit(NULL);
  552:                 }
  553: 
  554:                 if ((*(*((struct_processus_fils *)
  555:                         (*(*l_element_courant).donnee).objet)).thread)
  556:                         .thread_actif == d_vrai)
  557:                 {
  558:                     pthread_kill((*(*((struct_processus_fils *)
  559:                             (*(*l_element_courant).donnee).objet)).thread).tid,
  560:                             SIGURG);
  561:                 }
  562: 
  563:                 if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
  564:                         (*(*l_element_courant).donnee).objet)).thread)
  565:                         .mutex)) != 0)
  566:                 {
  567:                     pthread_mutex_unlock(&((*s_etat_processus).mutex));
  568:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  569: 
  570:                     pthread_mutex_lock(&((*s_argument_thread).mutex));
  571:                     pthread_mutex_unlock(&((*s_argument_thread).mutex));
  572: 
  573:                     (*s_argument_thread).thread_actif = d_faux;
  574: 
  575:                     pthread_exit(NULL);
  576:                 }
  577:             }
  578:             else
  579:             {
  580:                 if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
  581:                         (*(*l_element_courant).donnee).objet)).thread).mutex))
  582:                         != 0)
  583:                 {
  584:                     pthread_mutex_unlock(&((*s_etat_processus).mutex));
  585:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  586: 
  587:                     pthread_mutex_lock(&((*s_argument_thread).mutex));
  588:                     pthread_mutex_unlock(&((*s_argument_thread).mutex));
  589: 
  590:                     (*s_argument_thread).thread_actif = d_faux;
  591: 
  592:                     pthread_exit(NULL);
  593:                 }
  594: 
  595:                 if ((*(*((struct_processus_fils *)
  596:                         (*(*l_element_courant).donnee).objet)).thread)
  597:                         .thread_actif == d_vrai)
  598:                 {
  599:                     if ((*s_etat_processus).arret_depuis_abort == -1)
  600:                     {
  601:                         pthread_kill((*(*((struct_processus_fils *)
  602:                                 (*(*l_element_courant).donnee).objet)).thread)
  603:                                 .tid, SIGFABORT);
  604:                     }
  605:                     else
  606:                     {
  607:                         pthread_kill((*(*((struct_processus_fils *)
  608:                                 (*(*l_element_courant).donnee).objet)).thread)
  609:                                 .tid, SIGFSTOP);
  610:                     }
  611:                 }
  612: 
  613:                 if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
  614:                         (*(*l_element_courant).donnee).objet)).thread).mutex))
  615:                         != 0)
  616:                 {
  617:                     pthread_mutex_unlock(&((*s_etat_processus).mutex));
  618:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  619: 
  620:                     pthread_mutex_lock(&((*s_argument_thread).mutex));
  621:                     pthread_mutex_unlock(&((*s_argument_thread).mutex));
  622: 
  623:                     (*s_argument_thread).thread_actif = d_faux;
  624: 
  625:                     pthread_exit(NULL);
  626:                 }
  627:             }
  628:         }
  629: 
  630:         l_element_courant = (*l_element_courant).suivant;
  631:     }
  632: 
  633:     /*
  634:      * Attente de la fin de tous les processus fils
  635:      */
  636: 
  637:     for(i = 0; i < d_NOMBRE_INTERRUPTIONS;
  638:             (*s_etat_processus).masque_interruptions[i++] = 'I');
  639: 
  640:     attente.tv_sec = 0;
  641:     attente.tv_nsec = GRANULARITE_us * 1000;
  642: 
  643:     while((*s_etat_processus).l_base_pile_processus != NULL)
  644:     {
  645:         status = 0;
  646: 
  647:         l_element_courant = (struct_liste_chainee *)
  648:                 (*s_etat_processus).l_base_pile_processus;
  649: 
  650:         registre_stop = (*s_etat_processus)
  651:                 .var_volatile_traitement_retarde_stop;
  652:         (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
  653: 
  654:         for(i = 0; i < (unsigned long) (*(*((struct_processus_fils *)
  655:                 (*(*l_element_courant).donnee).objet)).thread)
  656:                 .nombre_objets_dans_pipe; i++)
  657:         {
  658:             if ((s_objet_temporaire = lecture_pipe(s_etat_processus,
  659:                     (*(*((struct_processus_fils *) (*(*l_element_courant)
  660:                     .donnee).objet)).thread).pipe_objets[0])) != NULL)
  661:             {
  662:                 liberation(s_etat_processus, s_objet_temporaire);
  663: 
  664:                 (*(*((struct_processus_fils *) (*(*l_element_courant)
  665:                         .donnee).objet)).thread).nombre_objets_dans_pipe--;
  666: 
  667:                 action.sa_handler = SIG_IGN;
  668:                 action.sa_flags = SA_ONSTACK;
  669: 
  670:                 if (sigaction(SIGPIPE, &action, &registre) != 0)
  671:                 {
  672:                     pthread_mutex_unlock(&((*s_etat_processus).mutex));
  673: 
  674:                     if (registre_stop == 0)
  675:                     {
  676:                         if ((*s_etat_processus)
  677:                                 .var_volatile_traitement_retarde_stop
  678:                                 == -1)
  679:                         {
  680:                             (*s_etat_processus)
  681:                                     .var_volatile_requete_arret = -1;
  682:                         }
  683: 
  684:                         (*s_etat_processus)
  685:                                 .var_volatile_traitement_retarde_stop =
  686:                                 registre_stop;
  687:                     }
  688: 
  689:                     (*s_etat_processus).erreur_systeme = d_es_signal;
  690:                     exit(EXIT_FAILURE);
  691:                 }
  692: 
  693:                 while((longueur_ecriture = write_atomic(
  694:                         s_etat_processus, (*(*((struct_processus_fils *)
  695:                         (*(*l_element_courant).donnee).objet)).thread)
  696:                         .pipe_nombre_injections[1], "+",
  697:                         sizeof(unsigned char))) !=
  698:                         sizeof(unsigned char))
  699:                 {
  700:                     if (longueur_ecriture == -1)
  701:                     {
  702:                         // Le processus n'existe plus.
  703:                         break;
  704:                     }
  705:                 }
  706: 
  707:                 if (registre_stop == 0)
  708:                 {
  709:                     if ((*s_etat_processus)
  710:                             .var_volatile_traitement_retarde_stop == -1)
  711:                     {
  712:                         (*s_etat_processus).var_volatile_requete_arret
  713:                                 = -1;
  714:                     }
  715: 
  716:                     (*s_etat_processus)
  717:                             .var_volatile_traitement_retarde_stop =
  718:                             registre_stop;
  719:                 }
  720: 
  721:                 if (sigaction(SIGPIPE, &registre, NULL) != 0)
  722:                 {
  723:                     pthread_mutex_unlock(&((*s_etat_processus).mutex));
  724: 
  725:                     (*s_etat_processus).erreur_systeme = d_es_signal;
  726:                     exit(EXIT_FAILURE);
  727:                 }
  728:             }
  729:         }
  730: 
  731:         if ((*(*((struct_processus_fils *) (*(*l_element_courant)
  732:                 .donnee).objet)).thread).processus_detache == d_vrai)
  733:         {
  734:             if (waitpid((*(*((struct_processus_fils *)
  735:                     (*(*l_element_courant).donnee).objet)).thread).pid,
  736:                     &status, WNOHANG) < 0)
  737:             {
  738:             }
  739:         }
  740: 
  741:         pthread_mutex_unlock(&((*s_etat_processus).mutex));
  742: 
  743:         if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)
  744:         {
  745:             affectation_interruptions_logicielles(s_etat_processus);
  746:         }
  747: 
  748:         nanosleep(&attente, NULL);
  749:         pthread_mutex_lock(&((*s_etat_processus).mutex));
  750:     }
  751: 
  752:     pthread_mutex_unlock(&((*s_etat_processus).mutex));
  753: 
  754:     l_element_courant = (*s_etat_processus).s_sockets;
  755: 
  756:     while(l_element_courant != NULL)
  757:     {
  758:         l_element_suivant = (*l_element_courant).suivant;
  759: 
  760:         /*
  761:          * Fermeture des sockets créées dans le processus courant.
  762:          */
  763: 
  764:         if (((*((struct_socket *) (*(*l_element_courant).donnee).objet))
  765:                 .pid == getpid()) && (pthread_equal((*((struct_socket *)
  766:                 (*(*l_element_courant).donnee).objet)).tid, pthread_self())
  767:                 != 0))
  768:         {
  769:             if ((*((struct_socket *) (*(*l_element_courant).donnee).objet))
  770:                     .socket_connectee == d_vrai)
  771:             {
  772:                 shutdown((*((struct_socket *) (*(*l_element_courant).donnee)
  773:                         .objet)).socket, SHUT_RDWR);
  774:             }
  775: 
  776:             close((*((struct_socket *) (*(*l_element_courant).donnee).objet))
  777:                     .socket);
  778: 
  779:             if ((*((struct_socket *) (*(*l_element_courant).donnee).objet))
  780:                     .effacement == 'Y')
  781:             {
  782:                 unlink((*((struct_socket *) (*(*l_element_courant).donnee)
  783:                         .objet)).adresse);
  784:             }
  785:         }
  786: 
  787:         liberation(s_etat_processus, (*((struct_liste_chainee *)
  788:                 l_element_courant)).donnee);
  789:         free(l_element_courant);
  790: 
  791:         l_element_courant = l_element_suivant;
  792:     }
  793: 
  794:     l_element_courant = (*s_etat_processus).s_connecteurs_sql;
  795: 
  796:     while(l_element_courant != NULL)
  797:     {
  798:         l_element_suivant = (*l_element_courant).suivant;
  799: 
  800:         /*
  801:          * Fermeture des connecteurs créés dans le processus courant.
  802:          */
  803: 
  804:         if (((*((struct_socket *) (*(*l_element_courant).donnee).objet))
  805:                 .pid == getpid()) && (pthread_equal((*((struct_socket *)
  806:                 (*(*l_element_courant).donnee).objet)).tid, pthread_self())
  807:                 != 0))
  808:         {
  809:             sqlclose((*l_element_courant).donnee);
  810:         }
  811: 
  812:         liberation(s_etat_processus, (*((struct_liste_chainee *)
  813:                 l_element_courant)).donnee);
  814:         free(l_element_courant);
  815: 
  816:         l_element_courant = l_element_suivant;
  817:     }
  818: 
  819:     if ((((*s_etat_processus).erreur_execution != d_ex) ||
  820:             ((*s_etat_processus).exception != d_ep) ||
  821:             ((*s_etat_processus).erreur_systeme != d_es)) &&
  822:             ((*s_etat_processus).var_volatile_traitement_sigint == 0))
  823:     {
  824:         printf("%s [%d]\n", message =
  825:                 messages(s_etat_processus), (int) getpid());
  826:         free(message);
  827: 
  828:         if ((*s_etat_processus).core == d_vrai)
  829:         {
  830:             printf("\n");
  831: 
  832:             if ((*s_etat_processus).langue == 'F')
  833:             {
  834:                  printf("+++Information : Génération du fichier rpl-core "
  835:                         "[%d]\n", (int) getpid());
  836:             }
  837:             else
  838:             {
  839:                 printf("+++Information : Writing rpl-core file [%d]\n",
  840:                         (int) getpid());
  841:             }
  842: 
  843:             rplcore(s_etat_processus);
  844: 
  845:             if ((*s_etat_processus).langue == 'F')
  846:             {
  847:                 printf("+++Information : Processus tracé [%d]\n",
  848:                         (int) getpid());
  849:             }
  850:             else
  851:             {
  852:                 printf("+++Information : Done [%d]\n", (int) getpid());
  853:             }
  854: 
  855:             printf("\n");
  856:             fflush(stdout);
  857:         }
  858:     }
  859: 
  860:     if ((*s_etat_processus).entree_standard != NULL)
  861:     {
  862:         pclose((*s_etat_processus).entree_standard);
  863:         (*s_etat_processus).entree_standard = NULL;
  864:     }
  865: 
  866:     if ((*s_etat_processus).fichiers_graphiques != NULL)
  867:     {
  868:         instruction_cllcd(s_etat_processus);
  869:     }
  870: 
  871:     liberation(s_etat_processus, (*s_etat_processus).indep);
  872:     liberation(s_etat_processus, (*s_etat_processus).depend);
  873: 
  874:     free((*s_etat_processus).label_x);
  875:     free((*s_etat_processus).label_y);
  876:     free((*s_etat_processus).label_z);
  877:     free((*s_etat_processus).titre);
  878:     free((*s_etat_processus).legende);
  879: 
  880:     liberation(s_etat_processus,
  881:             (*s_etat_processus).parametres_courbes_de_niveau);
  882: 
  883:     if ((*s_etat_processus).instruction_derniere_erreur != NULL)
  884:     {
  885:         free((*s_etat_processus).instruction_derniere_erreur);
  886:         (*s_etat_processus).instruction_derniere_erreur = NULL;
  887:     }
  888: 
  889:     liberation_arbre_variables(s_etat_processus,
  890:             (*s_etat_processus).s_arbre_variables, d_faux);
  891: 
  892:     for(i = 0; i < (*s_etat_processus).nombre_variables_statiques; i++)
  893:     {
  894:         liberation(s_etat_processus,
  895:                 (*s_etat_processus).s_liste_variables_statiques[i].objet);
  896:         free((*s_etat_processus).s_liste_variables_statiques[i].nom);
  897:     }
  898: 
  899:     free((*s_etat_processus).s_liste_variables_statiques);
  900: 
  901:     l_element_courant = (*s_etat_processus).l_base_pile;
  902:     while(l_element_courant != NULL)
  903:     {
  904:         l_element_suivant = (*l_element_courant).suivant;
  905: 
  906:         liberation(s_etat_processus, (*l_element_courant).donnee);
  907:         free(l_element_courant);
  908: 
  909:         l_element_courant = l_element_suivant;
  910:     }
  911: 
  912:     l_element_courant = (*s_etat_processus).l_base_pile_last;
  913:     while(l_element_courant != NULL)
  914:     {
  915:         l_element_suivant = (*l_element_courant).suivant;
  916: 
  917:         liberation(s_etat_processus, (*l_element_courant).donnee);
  918:         free(l_element_courant);
  919: 
  920:         l_element_courant = l_element_suivant;
  921:     }
  922: 
  923:     l_element_courant = (*s_etat_processus).l_base_pile_contextes;
  924:     while(l_element_courant != NULL)
  925:     {
  926:         l_element_suivant = (*l_element_courant).suivant;
  927: 
  928:         liberation(s_etat_processus, (*l_element_courant).donnee);
  929:         free(l_element_courant);
  930: 
  931:         l_element_courant = l_element_suivant;
  932:     }
  933: 
  934:     l_element_courant = (*s_etat_processus).l_base_pile_taille_contextes;
  935:     while(l_element_courant != NULL)
  936:     {
  937:         l_element_suivant = (*l_element_courant).suivant;
  938: 
  939:         liberation(s_etat_processus, (*l_element_courant).donnee);
  940:         free(l_element_courant);
  941: 
  942:         l_element_courant = l_element_suivant;
  943:     }
  944: 
  945:     l_element_courant = (struct_liste_chainee *)
  946:             (*s_etat_processus).l_base_pile_systeme;
  947:     while(l_element_courant != NULL)
  948:     {
  949:         l_element_suivant = (struct_liste_chainee *)
  950:                 (*((struct_liste_pile_systeme *)
  951:                 l_element_courant)).suivant;
  952: 
  953:         liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
  954:                 l_element_courant)).indice_boucle);
  955:         liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
  956:                 l_element_courant)).limite_indice_boucle);
  957:         liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
  958:                 l_element_courant)).objet_de_test);
  959: 
  960:         if ((*((struct_liste_pile_systeme *)
  961:                 l_element_courant)).nom_variable != NULL)
  962:         {
  963:             free((*((struct_liste_pile_systeme *)
  964:                     l_element_courant)).nom_variable);
  965:         }
  966: 
  967:         free((struct_liste_pile_systeme *) l_element_courant);
  968: 
  969:         l_element_courant = l_element_suivant;
  970:     }
  971: 
  972:     l_element_courant = (*s_etat_processus).s_bibliotheques;
  973: 
  974:     while(l_element_courant != NULL)
  975:     {
  976:         l_element_suivant = (*l_element_courant).suivant;
  977: 
  978:         free((*((struct_bibliotheque *) (*l_element_courant).donnee)).nom);
  979: 
  980:         if (((*((struct_bibliotheque *) (*l_element_courant).donnee)).pid
  981:                 == getpid()) && (pthread_equal((*((struct_bibliotheque *)
  982:                 (*l_element_courant).donnee)).tid, pthread_self()) != 0))
  983:         {
  984:             dlclose((*((struct_bibliotheque *) (*l_element_courant).donnee))
  985:                     .descripteur);
  986:         }
  987: 
  988:         free((*l_element_courant).donnee);
  989:         free(l_element_courant);
  990: 
  991:         l_element_courant = l_element_suivant;
  992:     }
  993: 
  994:     for(i = 0; i < (*s_etat_processus).nombre_instructions_externes; i++)
  995:     {
  996:         free((*s_etat_processus).s_instructions_externes[i].nom);
  997:         free((*s_etat_processus).s_instructions_externes[i]
  998:                 .nom_bibliotheque);
  999:     }
 1000: 
 1001:     if ((*s_etat_processus).nombre_instructions_externes != 0)
 1002:     {
 1003:         free((*s_etat_processus).s_instructions_externes);
 1004:     }
 1005: 
 1006:     if ((*s_etat_processus).debug == d_vrai)
 1007:         if (((*s_etat_processus).type_debug & d_debug_processus) != 0)
 1008:     {
 1009:         if ((*s_etat_processus).langue == 'F')
 1010:         {
 1011:             printf("[%d] Fin du thread %llu\n", (int) getpid(),
 1012:                     (unsigned long long) pthread_self());
 1013:         }
 1014:         else
 1015:         {
 1016:             printf("[%d] End of thread %llu\n", (int) getpid(),
 1017:                     (unsigned long long) pthread_self());
 1018:         }
 1019: 
 1020:         fflush(stdout);
 1021:     }
 1022: 
 1023:     liberation(s_etat_processus, (*s_argument_thread).argument);
 1024:     liberation(s_etat_processus, (*s_etat_processus).at_exit);
 1025:     liberation(s_etat_processus, (*s_etat_processus).at_poke);
 1026: 
 1027:     for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)
 1028:     {
 1029:         liberation(s_etat_processus,
 1030:                 (*s_etat_processus).corps_interruptions[i]);
 1031: 
 1032:         l_element_courant = (*s_etat_processus)
 1033:                 .pile_origine_interruptions[i];
 1034: 
 1035:         while(l_element_courant != NULL)
 1036:         {
 1037:             l_element_suivant = (*l_element_courant).suivant;
 1038: 
 1039:             liberation(s_etat_processus, (*l_element_courant).donnee);
 1040:             free(l_element_courant);
 1041: 
 1042:             l_element_courant = l_element_suivant;
 1043:         }
 1044:     }
 1045: 
 1046:     l_element_courant = (struct_liste_chainee *) (*s_etat_processus).s_marques;
 1047: 
 1048:     while(l_element_courant != NULL)
 1049:     {
 1050:         free((*((struct_marque *) l_element_courant)).label);
 1051:         free((*((struct_marque *) l_element_courant)).position);
 1052:         l_element_suivant = (struct_liste_chainee *)
 1053:                 (*((struct_marque *) l_element_courant)).suivant;
 1054:         free((struct_marque *) l_element_courant);
 1055:         l_element_courant = l_element_suivant;
 1056:     }
 1057: 
 1058:     if ((*s_etat_processus).generateur_aleatoire != NULL)
 1059:     {
 1060:         liberation_generateur_aleatoire(s_etat_processus);
 1061:     }
 1062: 
 1063:     if ((*s_etat_processus).profilage == d_vrai)
 1064:     {
 1065:         ecriture_profil(s_etat_processus);
 1066:         liberation_profil(s_etat_processus);
 1067:     }
 1068: 
 1069:     liberation_allocateur(s_etat_processus);
 1070: 
 1071:     retrait_thread(s_etat_processus);
 1072:     pthread_mutex_destroy(&((*s_etat_processus).mutex));
 1073:     pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation));
 1074: 
 1075:     sem_destroy(&((*s_etat_processus).semaphore_fork));
 1076: 
 1077:     liberation_contexte_cas(s_etat_processus);
 1078:     free((*s_etat_processus).localisation);
 1079:     free(s_etat_processus);
 1080: 
 1081:     pthread_mutex_lock(&((*s_argument_thread).mutex));
 1082:     pthread_mutex_unlock(&((*s_argument_thread).mutex));
 1083: 
 1084:     (*s_argument_thread).thread_actif = d_faux;
 1085:     pthread_exit(NULL);
 1086:     return(NULL);
 1087: }
 1088: 
 1089: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>