--- rpl/src/instructions_s10.c 2013/05/23 12:45:08 1.77 +++ rpl/src/instructions_s10.c 2022/09/07 13:40:39 1.107 @@ -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.34 + Copyright (C) 1989-2021 Dr. BERTRAND Joël This file is part of RPL/2. @@ -38,6 +38,8 @@ void instruction_spawn(struct_processus *s_etat_processus) { + int ios; + logical1 drapeau; logical1 variable_partagee; @@ -415,8 +417,31 @@ instruction_spawn(struct_processus *s_et return; } +# 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; + } + nanosleep(&attente, NULL); +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) +# endif + { + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + if (pthread_mutex_lock(&((*s_argument_thread).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -489,11 +514,34 @@ instruction_spawn(struct_processus *s_et return; } - if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0) + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; + + while((ios = pthread_mutex_trylock(&((*s_etat_processus) + .mutex_pile_processus))) != 0) { - pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex)); - (*s_etat_processus).erreur_systeme = d_es_processus; - return; + if (ios != EBUSY) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + } + + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + + nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); + + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) + { + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } } // Si le tid existe déjà  dans la pile des processus, il s'agit forcement @@ -522,18 +570,37 @@ instruction_spawn(struct_processus *s_et { scrutation_injection(s_etat_processus); + if (pthread_mutex_lock(&((*s_etat_processus) + .mutex_interruptions)) != 0) + { + pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)); + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + if ((*s_etat_processus).nombre_interruptions_non_affectees != 0) { affectation_interruptions_logicielles(s_etat_processus); } + if (pthread_mutex_unlock(&((*s_etat_processus) + .mutex_interruptions)) != 0) + { + pthread_mutex_unlock(&((*s_etat_processus) + .mutex_pile_processus)); + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + if ((*s_etat_processus).nombre_interruptions_en_queue != 0) { traitement_interruptions_logicielles(s_etat_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; return; @@ -542,7 +609,8 @@ instruction_spawn(struct_processus *s_et 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 = d_es_processus; return; @@ -562,11 +630,11 @@ instruction_spawn(struct_processus *s_et (struct_liste_chainee **) &((*s_etat_processus) .l_base_pile_processus), s_objet_systeme) == d_erreur) { - 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)) != 0) + if (pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -617,7 +685,8 @@ instruction_spawn(struct_processus *s_et // Le fils peut être présent sans être en attente du signal de départ. - if (envoi_signal_thread((*s_argument_thread).tid, rpl_sigstart) != 0) + if (envoi_signal_thread(s_etat_processus, + (*s_argument_thread).tid, rpl_sigstart) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return;