--- rpl/src/gestion_interruptions.c 2010/05/24 10:58:30 1.8 +++ rpl/src/gestion_interruptions.c 2014/04/25 07:37:29 1.51 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.16 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.18 + Copyright (C) 1989-2014 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -43,15 +43,10 @@ affectation_interruptions_logicielles(st sig_atomic_t registre; volatile struct_liste_chainee *l_element_courant; + struct_liste_chainee *l_element; 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 @@ -59,13 +54,6 @@ 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; - - if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - return; } @@ -83,8 +71,6 @@ affectation_interruptions_logicielles(st if ((*(*l_element_courant).donnee).type != PRC) { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); - (*s_etat_processus).erreur_systeme = d_es_processus; return; } @@ -92,8 +78,6 @@ 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)); - (*s_etat_processus).erreur_systeme = d_es_processus; return; } @@ -124,7 +108,6 @@ 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)); @@ -145,7 +128,6 @@ 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)); @@ -155,11 +137,12 @@ affectation_interruptions_logicielles(st return; } + // Pile LIFO + if (empilement(s_etat_processus, &((*s_etat_processus) .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)); @@ -169,6 +152,27 @@ affectation_interruptions_logicielles(st (*s_etat_processus).queue_interruptions[interruption - 1]++; (*s_etat_processus).nombre_interruptions_en_queue++; + // Transformation en FIFO + + if ((*s_etat_processus).queue_interruptions + [interruption - 1] > 1) + { + l_element = (*s_etat_processus) + .pile_origine_interruptions[interruption - 1]; + + while((*l_element).suivant != NULL) + { + l_element = (*l_element).suivant; + } + + (*l_element).suivant = (*s_etat_processus) + .pile_origine_interruptions[interruption - 1]; + (*s_etat_processus).pile_origine_interruptions + [interruption - 1] = + (*(*l_element).suivant).suivant; + (*(*l_element).suivant).suivant = NULL; + } + if ((*s_etat_processus).debug == d_vrai) if (((*s_etat_processus).type_debug & d_traitement_interruption) != 0) @@ -229,7 +233,6 @@ 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)); @@ -253,8 +256,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; } @@ -262,12 +263,6 @@ affectation_interruptions_logicielles(st l_element_courant = (*l_element_courant).suivant; } - if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - return; }