--- rpl/src/fusible.c 2011/04/14 08:46:37 1.20.2.2 +++ rpl/src/fusible.c 2016/03/01 22:12:27 1.66 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.23 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.25 + Copyright (C) 1989-2016 Dr. BERTRAND Joël This file is part of RPL/2. @@ -40,30 +40,25 @@ void * fusible(void *argument) { -# ifndef OS2 - real8 temps_cpu_precedent; real8 temps_cpu_courant; - sigset_t masque; - struct_processus *s_etat_processus; +# ifndef OS2 struct rusage s_rusage; +# else + clock_t horloge; +# endif struct timespec temporisation; - s_etat_processus = argument; + sigset_t set; + + sigfillset(&set); + pthread_sigmask(SIG_BLOCK, &set, NULL); - sigemptyset(&masque); - sigaddset(&masque, SIGINJECT); - sigaddset(&masque, SIGFSTOP); - sigaddset(&masque, SIGFABORT); - sigaddset(&masque, SIGURG); - sigaddset(&masque, SIGALRM); - sigaddset(&masque, SIGCONT); - sigaddset(&masque, SIGINT); - pthread_sigmask(SIG_BLOCK, &masque, NULL); + s_etat_processus = argument; if ((*s_etat_processus).debug == d_vrai) if (((*s_etat_processus).type_debug & @@ -87,21 +82,41 @@ fusible(void *argument) temporisation.tv_sec = 0; temporisation.tv_nsec = 100000000; // un dixième de seconde + // Par défaut, le thread peut être annulé. + +# ifdef PTHREAD_CANCEL_ENABLE pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); +# endif - getrusage(RUSAGE_SELF, &s_rusage); - temps_cpu_courant = s_rusage.ru_utime.tv_sec + - (((real8) s_rusage.ru_utime.tv_usec) / ((real8) 1E6)); +# ifndef OS2 + getrusage(RUSAGE_SELF, &s_rusage); + temps_cpu_courant = ((real8) s_rusage.ru_utime.tv_sec) + + (((real8) s_rusage.ru_utime.tv_usec) / ((real8) 1E6)); +# else + horloge = clock(); + temps_cpu_courant = horloge / CLOCKS_PER_SEC; +# endif do { pthread_testcancel(); nanosleep(&temporisation, NULL); - getrusage(RUSAGE_SELF, &s_rusage); - temps_cpu_precedent = temps_cpu_courant; - temps_cpu_courant = s_rusage.ru_utime.tv_sec + - (((real8) s_rusage.ru_utime.tv_usec) / ((real8) 1E6)); + +# ifndef OS2 + getrusage(RUSAGE_SELF, &s_rusage); + temps_cpu_courant = ((real8) s_rusage.ru_utime.tv_sec) + + (((real8) s_rusage.ru_utime.tv_usec) / ((real8) 1E6)); +# else + horloge = clock(); + temps_cpu_courant = horloge / CLOCKS_PER_SEC; + + if (temps_cpu_courant < temps_cpu_precedent) + { + // Le compteur a fait un tour... + temps_cpu_precedent = temps_cpu_courant; + } +# endif (*s_etat_processus).temps_maximal_cpu -= temps_cpu_courant - temps_cpu_precedent; @@ -110,8 +125,8 @@ fusible(void *argument) { (*s_etat_processus).temps_maximal_cpu = 0; - pthread_kill((*s_etat_processus).thread_surveille_par_fusible, - SIGFSTOP); + envoi_signal_thread((*s_etat_processus) + .thread_surveille_par_fusible, rpl_sigstop); break; } } while((*s_etat_processus).var_volatile_requete_arret == 0); @@ -133,22 +148,6 @@ fusible(void *argument) fflush(stdout); } -# else - - struct_processus *s_etat_processus; - - s_etat_processus = argument; - - if ((*s_etat_processus).langue == 'F') - { - printf("+++Attention : Support indisponible sous OS/2\n"); - } - else - { - printf("+++Warning : Function unavailable\n"); - } -# endif - pthread_exit(NULL); }