version 1.27, 2011/06/24 20:31:35
|
version 1.60, 2015/01/05 13:12:31
|
Line 1
|
Line 1
|
/* |
/* |
================================================================================ |
================================================================================ |
RPL/2 (R) version 4.1.0.prerelease.4 |
RPL/2 (R) version 4.1.19 |
Copyright (C) 1989-2011 Dr. BERTRAND Joël |
Copyright (C) 1989-2015 Dr. BERTRAND Joël |
|
|
This file is part of RPL/2. |
This file is part of RPL/2. |
|
|
Line 40
|
Line 40
|
void * |
void * |
fusible(void *argument) |
fusible(void *argument) |
{ |
{ |
# ifndef OS2 |
|
|
|
real8 temps_cpu_precedent; |
real8 temps_cpu_precedent; |
real8 temps_cpu_courant; |
real8 temps_cpu_courant; |
|
|
sigset_t masque; |
|
|
|
struct_processus *s_etat_processus; |
struct_processus *s_etat_processus; |
|
|
|
# ifndef OS2 |
struct rusage s_rusage; |
struct rusage s_rusage; |
|
# else |
|
clock_t horloge; |
|
# endif |
|
|
struct timespec temporisation; |
struct timespec temporisation; |
|
|
s_etat_processus = argument; |
sigset_t set; |
|
|
|
sigfillset(&set); |
|
pthread_sigmask(SIG_BLOCK, &set, NULL); |
|
|
sigemptyset(&masque); |
s_etat_processus = argument; |
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); |
|
|
|
if ((*s_etat_processus).debug == d_vrai) |
if ((*s_etat_processus).debug == d_vrai) |
if (((*s_etat_processus).type_debug & |
if (((*s_etat_processus).type_debug & |
Line 87 fusible(void *argument)
|
Line 82 fusible(void *argument)
|
temporisation.tv_sec = 0; |
temporisation.tv_sec = 0; |
temporisation.tv_nsec = 100000000; // un dixième de seconde |
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); |
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); |
|
# endif |
|
|
getrusage(RUSAGE_SELF, &s_rusage); |
# ifndef OS2 |
temps_cpu_courant = s_rusage.ru_utime.tv_sec + |
getrusage(RUSAGE_SELF, &s_rusage); |
(((real8) s_rusage.ru_utime.tv_usec) / ((real8) 1E6)); |
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 |
do |
{ |
{ |
pthread_testcancel(); |
pthread_testcancel(); |
nanosleep(&temporisation, NULL); |
nanosleep(&temporisation, NULL); |
getrusage(RUSAGE_SELF, &s_rusage); |
|
|
|
temps_cpu_precedent = temps_cpu_courant; |
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 - |
(*s_etat_processus).temps_maximal_cpu -= temps_cpu_courant - |
temps_cpu_precedent; |
temps_cpu_precedent; |
Line 110 fusible(void *argument)
|
Line 125 fusible(void *argument)
|
{ |
{ |
(*s_etat_processus).temps_maximal_cpu = 0; |
(*s_etat_processus).temps_maximal_cpu = 0; |
|
|
pthread_kill((*s_etat_processus).thread_surveille_par_fusible, |
envoi_signal_thread((*s_etat_processus) |
SIGFSTOP); |
.thread_surveille_par_fusible, rpl_sigstop); |
break; |
break; |
} |
} |
} while((*s_etat_processus).var_volatile_requete_arret == 0); |
} while((*s_etat_processus).var_volatile_requete_arret == 0); |
Line 133 fusible(void *argument)
|
Line 148 fusible(void *argument)
|
fflush(stdout); |
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); |
pthread_exit(NULL); |
} |
} |
|
|