Annotation of rpl/src/fusible.c, revision 1.1
1.1 ! bertrand 1: /*
! 2: ================================================================================
! 3: RPL/2 (R) version 4.0.9
! 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, SIGURG);
! 60: sigaddset(&masque, SIGALRM);
! 61: sigaddset(&masque, SIGCONT);
! 62: sigaddset(&masque, SIGINT);
! 63: pthread_sigmask(SIG_BLOCK, &masque, NULL);
! 64:
! 65: if ((*s_etat_processus).debug == d_vrai)
! 66: if (((*s_etat_processus).type_debug &
! 67: d_debug_fusible) != 0)
! 68: {
! 69: if ((*s_etat_processus).langue == 'F')
! 70: {
! 71: printf("[%d] Lancement du thread fusible du"
! 72: " processus\n", (int) getpid());
! 73: }
! 74: else
! 75: {
! 76: printf("[%d] Start fuse process\n", (int) getpid());
! 77: }
! 78:
! 79: fflush(stdout);
! 80: }
! 81:
! 82: s_etat_processus = argument;
! 83:
! 84: temporisation.tv_sec = 0;
! 85: temporisation.tv_nsec = 100000000; // un dixième de seconde
! 86:
! 87: pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
! 88:
! 89: getrusage(RUSAGE_SELF, &s_rusage);
! 90: temps_cpu_courant = s_rusage.ru_utime.tv_sec +
! 91: (((real8) s_rusage.ru_utime.tv_usec) / ((real8) 1E6));
! 92:
! 93: do
! 94: {
! 95: pthread_testcancel();
! 96: nanosleep(&temporisation, NULL);
! 97:
! 98: getrusage(RUSAGE_SELF, &s_rusage);
! 99:
! 100: temps_cpu_precedent = temps_cpu_courant;
! 101: temps_cpu_courant = s_rusage.ru_utime.tv_sec +
! 102: (((real8) s_rusage.ru_utime.tv_usec) / ((real8) 1E6));
! 103:
! 104: (*s_etat_processus).temps_maximal_cpu -= temps_cpu_courant -
! 105: temps_cpu_precedent;
! 106:
! 107: if ((*s_etat_processus).temps_maximal_cpu <= 0)
! 108: {
! 109: (*s_etat_processus).temps_maximal_cpu = 0;
! 110:
! 111: pthread_kill((*s_etat_processus).thread_surveille_par_fusible,
! 112: SIGFSTOP);
! 113: break;
! 114: }
! 115: } while((*s_etat_processus).var_volatile_requete_arret == 0);
! 116:
! 117: if ((*s_etat_processus).debug == d_vrai)
! 118: if (((*s_etat_processus).type_debug &
! 119: d_debug_fusible) != 0)
! 120: {
! 121: if ((*s_etat_processus).langue == 'F')
! 122: {
! 123: printf("[%d] Arrêt du thread fusible du"
! 124: " processus\n", (int) getpid());
! 125: }
! 126: else
! 127: {
! 128: printf("[%d] Stop fuse process\n", (int) getpid());
! 129: }
! 130:
! 131: fflush(stdout);
! 132: }
! 133:
! 134: pthread_exit(NULL);
! 135: }
! 136:
! 137: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>