File:  [local] / rpl / src / gestion_threads.c
Revision 1.17: download - view: text, annotated - select for diffs - revision graph
Sun May 16 19:36:20 2010 UTC (13 years, 11 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Correction d'un bug concernant le champ format des objets FCH et SCK.
La valeur nombre_occurrences n'était pas mise à jour correctement par
les copies et libérations d'objets.

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

CVSweb interface <joel.bertrand@systella.fr>