--- rpl/src/gestion_processus.c 2013/05/21 12:10:11 1.66 +++ rpl/src/gestion_processus.c 2019/02/17 16:08:40 1.98 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.14 - Copyright (C) 1989-2013 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.31 + Copyright (C) 1989-2019 Dr. BERTRAND Joël This file is part of RPL/2. @@ -77,20 +77,22 @@ surveillance_processus(void *argument) s_argument_thread = argument; s_etat_processus = (*s_argument_thread).s_etat_processus; - if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0) + if (pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; BUG(1, uprintf("General mutex error!\n")); } - insertion_thread_surveillance(s_etat_processus, s_argument_thread); + nombre_threads_surveillance_processus++; - if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) + if (pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; BUG(1, uprintf("General mutex error!\n")); } + insertion_thread_surveillance(s_etat_processus, s_argument_thread); + attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; @@ -176,7 +178,8 @@ surveillance_processus(void *argument) // Un objet supplémentaire est dans le pipe correspondant // au processus surveillé par ce thread. - if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0) + if (pthread_mutex_lock(&((*s_etat_processus) + .mutex_pile_processus)) != 0) { (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus; @@ -274,8 +277,23 @@ surveillance_processus(void *argument) (*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)) .thread).nombre_interruptions_dans_pipe++; + + if (pthread_mutex_lock(&((*s_etat_processus) + .mutex_interruptions)) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + } + (*s_etat_processus) .nombre_interruptions_non_affectees++; + + if (pthread_mutex_unlock(&((*s_etat_processus) + .mutex_interruptions)) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + } } if (pthread_mutex_unlock( @@ -346,7 +364,8 @@ surveillance_processus(void *argument) } } - envoi_signal_thread((*s_argument_thread).thread_pere, + envoi_signal_thread(NULL, + (*s_argument_thread).thread_pere, rpl_siginject); break; } @@ -364,8 +383,8 @@ surveillance_processus(void *argument) } } - if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) - != 0) + if (pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)) != 0) { (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus; @@ -373,7 +392,6 @@ surveillance_processus(void *argument) } else { - perror("read"); (*s_etat_processus).erreur_systeme = d_es_processus; } @@ -415,7 +433,8 @@ surveillance_processus(void *argument) // Un objet supplémentaire est dans le pipe correspondant // au processus surveillé par ce thread. - if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0) + if (pthread_mutex_lock(&((*s_etat_processus) + .mutex_pile_processus)) != 0) { (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus; @@ -430,8 +449,7 @@ surveillance_processus(void *argument) (*(*l_element_courant).donnee).objet)) .thread).processus_detache == d_vrai) { - l_element_courant = (*l_element_courant) - .suivant; + l_element_courant = (*l_element_courant).suivant; continue; } @@ -516,8 +534,23 @@ surveillance_processus(void *argument) (*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)) .thread).nombre_interruptions_dans_pipe++; + + if (pthread_mutex_lock(&((*s_etat_processus) + .mutex_interruptions)) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + } + (*s_etat_processus) .nombre_interruptions_non_affectees++; + + if (pthread_mutex_unlock(&((*s_etat_processus) + .mutex_interruptions)) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + } } if (pthread_mutex_unlock( @@ -592,8 +625,24 @@ surveillance_processus(void *argument) } } - envoi_signal_thread((*s_argument_thread).thread_pere, + if (pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)) != 0) + { + (*s_etat_processus).erreur_systeme_processus_fils = + d_es_processus; + } + + envoi_signal_thread(NULL, + (*s_argument_thread).thread_pere, rpl_siginject); + + if (pthread_mutex_lock(&((*s_etat_processus) + .mutex_pile_processus)) != 0) + { + (*s_etat_processus).erreur_systeme_processus_fils = + d_es_processus; + } + break; } @@ -610,8 +659,8 @@ surveillance_processus(void *argument) } } - if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) - != 0) + if (pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)) != 0) { (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus; @@ -654,7 +703,7 @@ surveillance_processus(void *argument) * reste plus rien dans les tuyaux... */ - if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0) + if (pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus)) != 0) { (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus; @@ -790,8 +839,23 @@ surveillance_processus(void *argument) (*(*l_element_courant).donnee).objet)) .thread) .nombre_interruptions_dans_pipe++; + + if (pthread_mutex_lock(&((*s_etat_processus) + .mutex_interruptions)) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + } + (*s_etat_processus) .nombre_interruptions_non_affectees++; + + if (pthread_mutex_unlock(&((*s_etat_processus) + .mutex_interruptions)) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + } } if (pthread_mutex_unlock( @@ -893,8 +957,23 @@ surveillance_processus(void *argument) (*(*l_element_courant).donnee).objet)) .thread) .nombre_interruptions_dans_pipe++; + + if (pthread_mutex_lock(&((*s_etat_processus) + .mutex_interruptions)) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + } + (*s_etat_processus) .nombre_interruptions_non_affectees++; + + if (pthread_mutex_unlock(&((*s_etat_processus) + .mutex_interruptions)) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + } } if (pthread_mutex_unlock( @@ -915,7 +994,8 @@ surveillance_processus(void *argument) } } - if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) + if (pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)) + != 0) { (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus; @@ -1009,7 +1089,7 @@ surveillance_processus(void *argument) (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus; } - if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0) + if (pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus)) != 0) { (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus; } @@ -1220,7 +1300,8 @@ surveillance_processus(void *argument) } else { - if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) + if (pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)) != 0) { (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus; @@ -1230,7 +1311,8 @@ surveillance_processus(void *argument) nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); - if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0) + if (pthread_mutex_lock(&((*s_etat_processus) + .mutex_pile_processus)) != 0) { (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus; @@ -1347,16 +1429,30 @@ surveillance_processus(void *argument) fflush(stdout); } + if (pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)) != 0) + { + (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus; + } + retrait_thread_surveillance(s_etat_processus, s_argument_thread); - if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) + if (pthread_mutex_lock(&((*s_etat_processus) + .mutex_pile_processus)) != 0) + { + (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus; + } + + nombre_threads_surveillance_processus--; + + if (pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)) != 0) { (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus; } } pthread_exit(NULL); - return(NULL); } @@ -2917,43 +3013,25 @@ lecture_pipe(struct_processus *s_etat_pr void scrutation_injection(struct_processus *s_etat_processus) { - fd_set ensemble_descripteurs; - logical1 drapeau_erreur; logical1 registre_arret_si_exception; -# ifdef PSELECT - struct timespec timeout; -# else - struct timeval timeout; -# endif + struct pollfd fds; unsigned char tampon; unsigned char tampon_profilage[20]; - // Si on est dans le processus père, il n'y a rien à surveiller. - scrutation_interruptions(s_etat_processus); + // Si on est dans le processus père, il n'y a rien à surveiller. + if ((*s_etat_processus).var_volatile_processus_racine == 0) { - FD_ZERO(&ensemble_descripteurs); - FD_SET((*s_etat_processus).pipe_nombre_injections, - &ensemble_descripteurs); - -# ifdef PSELECT - timeout.tv_sec = 0; - timeout.tv_nsec = 0; - - if (pselect((*s_etat_processus).pipe_nombre_injections + 1, - &ensemble_descripteurs, NULL, NULL, &timeout, NULL) > 0) -# else - timeout.tv_sec = 0; - timeout.tv_usec = 0; - - if (select((*s_etat_processus).pipe_nombre_injections + 1, - &ensemble_descripteurs, NULL, NULL, &timeout) > 0) -# endif + fds.fd = (*s_etat_processus).pipe_nombre_injections; + fds.events = POLLIN; + fds.revents = 0; + + if (poll(&fds, 1, 0) > 0) { if (read_atomic(s_etat_processus, (*s_etat_processus).pipe_nombre_injections, @@ -3110,7 +3188,6 @@ scrutation_injection(struct_processus *s } } } - } return;