File:  [local] / rpl / src / fusible.c
Revision 1.8: download - view: text, annotated - select for diffs - revision graph
Thu Apr 29 07:30:57 2010 UTC (14 years ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Correction d'un point bloquant dans la gestion des processus
(affectation des interruptions logicielles survenant après l'arrêt du
processus père car le mutex de protection de la routine était déjà positionné
dans la fonction appelante). Ajout de la fonction CLRATEXIT.

    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 fusible.
   29:   Elle déclanche un signal d'arrêt (SIGFSTOP) lorsque le timeout est
   30:   dépassé.
   31: ================================================================================
   32:   Entrées : pointeur sur une structure
   33: --------------------------------------------------------------------------------
   34:   Sorties :
   35: --------------------------------------------------------------------------------
   36:   Effets de bord : néant
   37: ================================================================================
   38: */
   39: 
   40: void *
   41: fusible(void *argument)
   42: {
   43:     real8                   temps_cpu_precedent;
   44:     real8                   temps_cpu_courant;
   45: 
   46:     sigset_t                masque;
   47: 
   48:     struct_processus        *s_etat_processus;
   49: 
   50:     struct rusage           s_rusage;
   51: 
   52:     struct timespec         temporisation;
   53: 
   54:     s_etat_processus = argument;
   55: 
   56:     sigemptyset(&masque);
   57:     sigaddset(&masque, SIGINJECT);
   58:     sigaddset(&masque, SIGFSTOP);
   59:     sigaddset(&masque, SIGFABORT);
   60:     sigaddset(&masque, SIGURG);
   61:     sigaddset(&masque, SIGALRM);
   62:     sigaddset(&masque, SIGCONT);
   63:     sigaddset(&masque, SIGINT);
   64:     pthread_sigmask(SIG_BLOCK, &masque, NULL);
   65: 
   66:     if ((*s_etat_processus).debug == d_vrai)
   67:         if (((*s_etat_processus).type_debug &
   68:                 d_debug_fusible) != 0)
   69:     {
   70:         if ((*s_etat_processus).langue == 'F')
   71:         {
   72:             printf("[%d] Lancement du thread fusible du"
   73:                     " processus\n", (int) getpid());
   74:         }
   75:         else
   76:         {
   77:             printf("[%d] Start fuse process\n", (int) getpid());
   78:         }
   79: 
   80:         fflush(stdout);
   81:     }
   82: 
   83:     s_etat_processus = argument;
   84: 
   85:     temporisation.tv_sec = 0;
   86:     temporisation.tv_nsec = 100000000; // un dixième de seconde
   87: 
   88:     pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
   89: 
   90:     getrusage(RUSAGE_SELF, &s_rusage);
   91:     temps_cpu_courant = s_rusage.ru_utime.tv_sec +
   92:             (((real8) s_rusage.ru_utime.tv_usec) / ((real8) 1E6));
   93: 
   94:     do
   95:     {
   96:         pthread_testcancel();
   97:         nanosleep(&temporisation, NULL);
   98: 
   99:         getrusage(RUSAGE_SELF, &s_rusage);
  100: 
  101:         temps_cpu_precedent = temps_cpu_courant;
  102:         temps_cpu_courant = s_rusage.ru_utime.tv_sec +
  103:                 (((real8) s_rusage.ru_utime.tv_usec) / ((real8) 1E6));
  104: 
  105:         (*s_etat_processus).temps_maximal_cpu -= temps_cpu_courant -
  106:                 temps_cpu_precedent;
  107: 
  108:         if ((*s_etat_processus).temps_maximal_cpu <= 0)
  109:         {
  110:             (*s_etat_processus).temps_maximal_cpu = 0;
  111: 
  112:             pthread_kill((*s_etat_processus).thread_surveille_par_fusible,
  113:                     SIGFSTOP);
  114:             break;
  115:         }
  116:     } while((*s_etat_processus).var_volatile_requete_arret == 0);
  117: 
  118:     if ((*s_etat_processus).debug == d_vrai)
  119:         if (((*s_etat_processus).type_debug &
  120:                 d_debug_fusible) != 0)
  121:     {
  122:         if ((*s_etat_processus).langue == 'F')
  123:         {
  124:             printf("[%d] Arrêt du thread fusible du"
  125:                     " processus\n", (int) getpid());
  126:         }
  127:         else
  128:         {
  129:             printf("[%d] Stop fuse process\n", (int) getpid());
  130:         }
  131: 
  132:         fflush(stdout);
  133:     }
  134: 
  135:     pthread_exit(NULL);
  136: }
  137: 
  138: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>