--- rpl/src/instructions_s10.c 2013/03/21 16:31:59 1.72 +++ rpl/src/instructions_s10.c 2013/05/22 13:40:12 1.76 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.13 + RPL/2 (R) version 4.1.14 Copyright (C) 1989-2013 Dr. BERTRAND Joël This file is part of RPL/2. @@ -233,7 +233,7 @@ instruction_spawn(struct_processus *s_et return; } - if (pipe((*s_argument_thread).pipe_nombre_interruptions_attente) != 0) + if (pipe((*s_argument_thread).pipe_nombre_elements_attente) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -251,12 +251,6 @@ instruction_spawn(struct_processus *s_et return; } - if (pipe((*s_argument_thread).pipe_nombre_objets_attente) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - if (pipe((*s_argument_thread).pipe_injections) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -293,12 +287,10 @@ instruction_spawn(struct_processus *s_et (*s_nouvel_etat_processus).pipe_donnees = (*s_argument_thread).pipe_objets[1]; - (*s_nouvel_etat_processus).pipe_nombre_objets_attente = - (*s_argument_thread).pipe_nombre_objets_attente[1]; + (*s_nouvel_etat_processus).pipe_nombre_elements_attente = + (*s_argument_thread).pipe_nombre_elements_attente[1]; (*s_nouvel_etat_processus).pipe_interruptions = (*s_argument_thread).pipe_interruptions[1]; - (*s_nouvel_etat_processus).pipe_nombre_interruptions_attente = - (*s_argument_thread).pipe_nombre_interruptions_attente[1]; (*s_nouvel_etat_processus).pipe_injections = (*s_argument_thread).pipe_injections[0]; (*s_nouvel_etat_processus).pipe_nombre_injections = @@ -407,13 +399,39 @@ instruction_spawn(struct_processus *s_et attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; + if (pthread_mutex_lock(&((*s_argument_thread).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + while((*s_argument_thread).thread_actif == d_faux) { scrutation_interruptions(s_etat_processus); + + if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + nanosleep(&attente, NULL); + + if (pthread_mutex_lock(&((*s_argument_thread).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + INCR_GRANULARITE(attente.tv_nsec); } + if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + if (pthread_attr_destroy(&attributs) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus;