--- rpl/src/instructions_p7.c 2011/09/14 17:55:59 1.35 +++ rpl/src/instructions_p7.c 2015/02/19 11:01:25 1.65 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.3 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.21 + Copyright (C) 1989-2015 Dr. BERTRAND Joël This file is part of RPL/2. @@ -718,7 +718,8 @@ instruction_poke(struct_processus *s_eta return; } - 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; return; @@ -753,7 +754,8 @@ instruction_poke(struct_processus *s_eta if (sigaction(SIGPIPE, &action, ®istre) != 0) { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); + pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)); (*s_etat_processus).erreur_systeme = d_es_signal; return; @@ -783,13 +785,18 @@ instruction_poke(struct_processus *s_eta if ((*s_etat_processus).erreur_systeme != d_es) { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); + pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)); return; } } - if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) - != 0) +# ifndef SEMAPHORES_NOMMES + if (sem_post(&((*s_etat_processus).semaphore_fork)) + != 0) +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) +# endif { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -801,16 +808,26 @@ instruction_poke(struct_processus *s_eta .pipe_nombre_injections[1], "-", sizeof(unsigned char))) != sizeof(unsigned char)) { - if (pthread_mutex_lock( - &((*s_etat_processus).mutex_fork)) != 0) +# ifndef SEMAPHORES_NOMMES + while(sem_wait( + &((*s_etat_processus).semaphore_fork)) != 0) +# else + while(sem_wait( + (*s_etat_processus).semaphore_fork) != 0) +# endif { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; + } } if (longueur_ecriture == -1) { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); + pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)); liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); @@ -845,8 +862,13 @@ instruction_poke(struct_processus *s_eta return; } - if (pthread_mutex_unlock( - &((*s_etat_processus).mutex_fork)) != 0) +# ifndef SEMAPHORES_NOMMES + if (sem_post( + &((*s_etat_processus).semaphore_fork)) != 0) +# else + if (sem_post( + (*s_etat_processus).semaphore_fork) != 0) +# endif { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -867,11 +889,18 @@ instruction_poke(struct_processus *s_eta } } - if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) - != 0) +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus).semaphore_fork)) + != 0) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) +# endif { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } } if (registre_stop == 0) @@ -894,7 +923,8 @@ instruction_poke(struct_processus *s_eta if (sigaction(SIGPIPE, ®istre, NULL) != 0) { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); + pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)); (*s_etat_processus).erreur_systeme = d_es_signal; return; @@ -931,7 +961,8 @@ instruction_poke(struct_processus *s_eta if (sigaction(SIGPIPE, &action, ®istre) != 0) { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); + pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)); (*s_etat_processus).erreur_systeme = d_es_signal; return; @@ -1006,13 +1037,19 @@ instruction_poke(struct_processus *s_eta if ((*s_etat_processus).erreur_systeme != d_es) { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); + pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)); return; } } - if (pthread_mutex_unlock( - &((*s_etat_processus).mutex_fork)) != 0) +# ifndef SEMAPHORES_NOMMES + if (sem_post( + &((*s_etat_processus).semaphore_fork)) != 0) +# else + if (sem_post( + (*s_etat_processus).semaphore_fork) != 0) +# endif { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1024,16 +1061,26 @@ instruction_poke(struct_processus *s_eta .pipe_nombre_injections[1], "-", sizeof(unsigned char))) != sizeof(unsigned char)) { - if (pthread_mutex_lock( - &((*s_etat_processus).mutex_fork)) != 0) +# ifndef SEMAPHORES_NOMMES + while(sem_wait( + &((*s_etat_processus).semaphore_fork)) != 0) +# else + while(sem_wait( + (*s_etat_processus).semaphore_fork) != 0) +# endif { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; + } } if (longueur_ecriture == -1) { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); + pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)); liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); @@ -1068,8 +1115,13 @@ instruction_poke(struct_processus *s_eta return; } - if (pthread_mutex_unlock( - &((*s_etat_processus).mutex_fork)) != 0) +# ifndef SEMAPHORES_NOMMES + if (sem_post( + &((*s_etat_processus).semaphore_fork)) != 0) +# else + if (sem_post( + (*s_etat_processus).semaphore_fork) != 0) +# endif { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1090,11 +1142,19 @@ instruction_poke(struct_processus *s_eta } } - if (pthread_mutex_lock( - &((*s_etat_processus).mutex_fork)) != 0) +# ifndef SEMAPHORES_NOMMES + while(sem_wait( + &((*s_etat_processus).semaphore_fork)) != 0) +# else + while(sem_wait( + (*s_etat_processus).semaphore_fork) != 0) +# endif { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } } if (registre_stop == 0) @@ -1117,7 +1177,8 @@ instruction_poke(struct_processus *s_eta if (sigaction(SIGPIPE, ®istre, NULL) != 0) { - pthread_mutex_unlock(&((*s_etat_processus).mutex)); + pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)); (*s_etat_processus).erreur_systeme = d_es_signal; return; @@ -1130,7 +1191,8 @@ instruction_poke(struct_processus *s_eta 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; @@ -1232,26 +1294,12 @@ instruction_private(struct_processus *s_ return; } - if (pthread_mutex_lock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - if (recherche_variable_partagee(s_etat_processus, ((*((struct_nom *) (*s_objet).objet)).nom), (*(*s_etat_processus) .pointeur_variable_courante).variable_partagee, (*(*s_etat_processus).pointeur_variable_courante).origine) - == d_faux) + == NULL) { - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - liberation(s_etat_processus, s_objet); (*s_etat_processus).erreur_systeme = d_es; @@ -1259,25 +1307,15 @@ instruction_private(struct_processus *s_ } (*(*s_etat_processus).pointeur_variable_courante).objet = - (*(*s_etat_processus).s_liste_variables_partagees).table - [(*(*s_etat_processus).s_liste_variables_partagees) - .position_variable].objet; - (*(*s_etat_processus).s_liste_variables_partagees).table - [(*(*s_etat_processus).s_liste_variables_partagees) - .position_variable].objet = NULL; + (*(*s_etat_processus).pointeur_variable_partagee_courante) + .objet; + (*(*s_etat_processus).pointeur_variable_partagee_courante).objet = NULL; if (retrait_variable_partagee(s_etat_processus, (*((struct_nom *) (*s_objet).objet)).nom, (*(*s_etat_processus).pointeur_variable_courante) .variable_partagee) == d_erreur) { - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - liberation(s_etat_processus, s_objet); return; } @@ -1292,13 +1330,6 @@ instruction_private(struct_processus *s_ (*(*s_etat_processus).pointeur_variable_courante) .variable_partagee.pointeur = NULL; } - - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } } else if ((*s_objet).type == LST) { @@ -1325,26 +1356,12 @@ instruction_private(struct_processus *s_ return; } - if (pthread_mutex_lock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - if (recherche_variable_partagee(s_etat_processus, ((*((struct_nom *) (*s_objet).objet)).nom), (*(*s_etat_processus) .pointeur_variable_courante).variable_partagee, (*(*s_etat_processus).pointeur_variable_courante).origine) - == d_faux) + == NULL) { - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - liberation(s_etat_processus, s_objet); (*s_etat_processus).erreur_systeme = d_es; @@ -1354,12 +1371,10 @@ instruction_private(struct_processus *s_ } (*(*s_etat_processus).pointeur_variable_courante).objet = - (*(*s_etat_processus).s_liste_variables_partagees).table - [(*(*s_etat_processus).s_liste_variables_partagees) - .position_variable].objet; - (*(*s_etat_processus).s_liste_variables_partagees).table - [(*(*s_etat_processus).s_liste_variables_partagees) - .position_variable].objet = NULL; + (*(*s_etat_processus).pointeur_variable_partagee_courante) + .objet; + (*(*s_etat_processus).pointeur_variable_partagee_courante).objet + = NULL; if ((*(*s_etat_processus).pointeur_variable_courante).origine == 'P') @@ -1378,24 +1393,10 @@ instruction_private(struct_processus *s_ (*(*s_etat_processus).pointeur_variable_courante) .variable_statique) == d_erreur) { - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - liberation(s_etat_processus, s_objet); return; } - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - l_element_courant = (*l_element_courant).suivant; } }