--- rpl/src/instructions_m4.c 2011/05/09 13:52:18 1.17.2.3 +++ rpl/src/instructions_m4.c 2023/08/07 17:42:56 1.83 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.24 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.35 + Copyright (C) 1989-2023 Dr. BERTRAND Joël This file is part of RPL/2. @@ -38,11 +38,14 @@ void instruction_mem(struct_processus *s_etat_processus) { - struct_liste_chainee *l_element_courant; + integer8 j; + integer8 nb_variables; - struct_objet *s_objet_resultat; + struct_liste_chainee *l_element_courant; + + struct_objet *s_objet_resultat; - unsigned long i; + struct_tableau_variables *tableau; (*s_etat_processus).erreur_execution = d_ex; @@ -139,47 +142,35 @@ instruction_mem(struct_processus *s_etat (*((integer8 *) (*((*((*((struct_liste_chainee *) (*s_objet_resultat).objet)).suivant)).donnee)).objet)) = 0; - for(i = 0; i < (*s_etat_processus).nombre_variables; i++) + nb_variables = nombre_variables(s_etat_processus); + + if ((tableau = malloc(((size_t) nb_variables) * + sizeof(struct_tableau_variables))) == NULL) { - (*((integer8 *) (*((*((*((struct_liste_chainee *) (*s_objet_resultat) - .objet)).suivant)).donnee)).objet)) += sizeof(unsigned char) * - strlen((*s_etat_processus).s_liste_variables[i].nom); - (*((integer8 *) (*((*((*((struct_liste_chainee *) (*s_objet_resultat) - .objet)).suivant)).donnee)).objet)) += occupation_memoire( - (*s_etat_processus).s_liste_variables[i].objet); + liberation_mutexes_arbre_variables_partagees(s_etat_processus, + (*(*s_etat_processus).s_arbre_variables_partagees)); + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; } - for(i = 0; i < (*s_etat_processus).nombre_variables_statiques; i++) + nb_variables = liste_variables(s_etat_processus, tableau); + + for(j = 0; j < nb_variables; j++) { - // Comptabilisation des empreintes mémoire des variables - // statiques qui ne sont pas accessibles, les variables statiques - // accessibles étant déjà comptabilitées par la boucle précédente. + (*((integer8 *) (*((*((*((struct_liste_chainee *) (*s_objet_resultat) + .objet)).suivant)).donnee)).objet)) += (integer8) + (sizeof(unsigned char) * strlen(tableau[j].nom)); + (*((integer8 *) (*((*((*((struct_liste_chainee *) (*s_objet_resultat) + .objet)).suivant)).donnee)).objet)) += occupation_memoire( + tableau[j].objet); - if ((*s_etat_processus).s_liste_variables_statiques[i].objet != NULL) - { - (*((integer8 *) (*((*((*((struct_liste_chainee *) - (*s_objet_resultat).objet)).suivant)).donnee)).objet)) += - sizeof(unsigned char) * strlen((*s_etat_processus) - .s_liste_variables_statiques[i].nom); - (*((integer8 *) (*((*((*((struct_liste_chainee *) - (*s_objet_resultat).objet)).suivant)).donnee)).objet)) += - occupation_memoire((*s_etat_processus) - .s_liste_variables_statiques[i].objet); + if(tableau[j].mutex != NULL) + { // La variable est une variable partagée. On libère le mutex. + pthread_mutex_unlock(tableau[j].mutex); } } - for(i = 0; i < (*(*s_etat_processus).s_liste_variables_partagees) - .nombre_variables; i++) - { - (*((integer8 *) (*((*((*((struct_liste_chainee *) - (*s_objet_resultat).objet)).suivant)).donnee)).objet)) += - sizeof(unsigned char) * strlen((*(*s_etat_processus) - .s_liste_variables_partagees).table[i].nom); - (*((integer8 *) (*((*((*((struct_liste_chainee *) - (*s_objet_resultat).objet)).suivant)).donnee)).objet)) += - occupation_memoire((*(*s_etat_processus) - .s_liste_variables_partagees).table[i].objet); - } + free(tableau); /* * Empilement du résultat @@ -397,33 +388,24 @@ instruction_mtxlock(struct_processus *s_ } # ifndef SEMAPHORES_NOMMES - if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) # else - if (sem_post((*s_etat_processus).semaphore_fork) != 0) + if (sem_post((*s_etat_processus).semaphore_fork) != 0) +# endif { (*s_etat_processus).erreur_systeme = d_es_processus; return; } -# endif if (pthread_mutex_lock(&((*((struct_mutex *) (*s_objet_argument).objet)) .mutex)) != 0) { # ifndef SEMAPHORES_NOMMES - while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else - while(sem_wait((*s_etat_processus).semaphore_fork) == -1) + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) # endif { - if ((*s_etat_processus).profilage == d_vrai) - { - profilage(s_etat_processus, NULL); - } - if (errno != EINTR) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -442,10 +424,12 @@ instruction_mtxlock(struct_processus *s_ return; } + (*((struct_mutex *) (*s_objet_argument).objet)).tid = pthread_self(); + # ifndef SEMAPHORES_NOMMES - while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else - while(sem_wait((*s_etat_processus).semaphore_fork) == -1) + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) # endif { if (errno != EINTR) @@ -597,6 +581,11 @@ instruction_mtxtrylock(struct_processus return; } } + else + { + (*((struct_mutex *) (*s_objet_argument).objet)).tid = + pthread_self(); + } if ((*s_etat_processus).profilage == d_vrai) { @@ -620,7 +609,7 @@ instruction_mtxtrylock(struct_processus return; } - (*((integer8 *) (*s_objet_resultat).objet)) = (ios == 0) ? 0 : -1; + (*((integer8 *) (*s_objet_resultat).objet)) = (ios == 0) ? -1 : 0; if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_resultat) == d_erreur) @@ -631,6 +620,7 @@ instruction_mtxtrylock(struct_processus return; } + /* ================================================================================ Fonction 'mtxstatus' @@ -755,18 +745,23 @@ instruction_mtxstatus(struct_processus * } } - if (pthread_mutex_unlock(&((*((struct_mutex *) - (*s_objet_argument).objet)).mutex)) != 0) + if (ios == 0) { - liberation(s_etat_processus, s_objet_argument); + // Le mutex a été verrouillé par le trylock précédent. - if ((*s_etat_processus).profilage == d_vrai) + if (pthread_mutex_unlock(&((*((struct_mutex *) + (*s_objet_argument).objet)).mutex)) != 0) { - profilage(s_etat_processus, NULL); - } + liberation(s_etat_processus, s_objet_argument); - (*s_etat_processus).erreur_systeme = d_es_processus; - return; + if ((*s_etat_processus).profilage == d_vrai) + { + profilage(s_etat_processus, NULL); + } + + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } } if ((*s_etat_processus).profilage == d_vrai) @@ -880,9 +875,19 @@ instruction_mtxunlock(struct_processus * if (l_element_courant == NULL) { + liberation(s_etat_processus, s_objet_argument); + (*s_etat_processus).erreur_execution = d_ex_mutex; + return; + } + if (pthread_equal(pthread_self(), (*((struct_mutex *) + (*s_objet_argument).objet)).tid) == 0) + { liberation(s_etat_processus, s_objet_argument); + + (*s_etat_processus).erreur_execution = + d_ex_mutex_acquis_autre_thread; return; } @@ -891,6 +896,15 @@ instruction_mtxunlock(struct_processus * { liberation(s_etat_processus, s_objet_argument); + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + + if (pthread_mutex_unlock(&((*((struct_mutex *) + (*s_objet_argument).objet)).mutex)) != 0) + { + liberation(s_etat_processus, s_objet_argument); + (*s_etat_processus).erreur_systeme = d_es_processus; return; }