--- rpl/src/gestion_interruptions.c 2010/07/14 14:19:34 1.12 +++ rpl/src/gestion_interruptions.c 2020/01/10 11:15:42 1.70 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.18 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.32 + Copyright (C) 1989-2020 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -39,6 +39,7 @@ void affectation_interruptions_logicielles(struct_processus *s_etat_processus) { int interruption; + int ios; sig_atomic_t registre; @@ -47,12 +48,6 @@ affectation_interruptions_logicielles(st struct_objet *s_objet_processus; - if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - if ((*s_etat_processus).var_volatile_requete_arret == -1) { // Si une requête d'arrêt est reçue par le processus durant la @@ -60,11 +55,15 @@ affectation_interruptions_logicielles(st // processus peut déjà être libérée par le thread de surveillance. (*s_etat_processus).nombre_interruptions_non_affectees = 0; + return; + } - if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) + if ((ios = pthread_mutex_trylock(&((*s_etat_processus) + .mutex_pile_processus))) != 0) + { + if (ios != EBUSY) { (*s_etat_processus).erreur_systeme = d_es_processus; - return; } return; @@ -84,7 +83,7 @@ affectation_interruptions_logicielles(st if ((*(*l_element_courant).donnee).type != PRC) { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); + pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)); (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -93,7 +92,7 @@ affectation_interruptions_logicielles(st if (pthread_mutex_lock(&((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread).mutex)) != 0) { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); + pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)); (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -125,10 +124,11 @@ affectation_interruptions_logicielles(st if ((interruption < 1) || (interruption > d_NOMBRE_INTERRUPTIONS)) { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); pthread_mutex_unlock(&((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread) .mutex)); + pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)); (*s_etat_processus).erreur_systeme = d_es_interruption_invalide; @@ -146,10 +146,11 @@ affectation_interruptions_logicielles(st if ((s_objet_processus = copie_objet(s_etat_processus, (*l_element_courant).donnee, 'P')) == NULL) { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); pthread_mutex_unlock(&((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread) .mutex)); + pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -162,10 +163,17 @@ affectation_interruptions_logicielles(st .pile_origine_interruptions[interruption - 1]), s_objet_processus) == d_erreur) { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); pthread_mutex_unlock(&((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread) .mutex)); + + if (pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + return; } @@ -253,9 +261,10 @@ affectation_interruptions_logicielles(st } else { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); pthread_mutex_unlock(&((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread).mutex)); + pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)); if (registre == 0) { @@ -277,8 +286,6 @@ affectation_interruptions_logicielles(st if (pthread_mutex_unlock(&((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread).mutex)) != 0) { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); - (*s_etat_processus).erreur_systeme = d_es_processus; return; } @@ -286,7 +293,7 @@ affectation_interruptions_logicielles(st l_element_courant = (*l_element_courant).suivant; } - 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; return;