--- rpl/src/instructions_s8.c 2011/09/14 17:55:59 1.34 +++ rpl/src/instructions_s8.c 2011/09/20 14:36:29 1.38 @@ -247,7 +247,11 @@ instruction_send(struct_processus *s_eta attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; - 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; @@ -257,10 +261,17 @@ instruction_send(struct_processus *s_eta (*s_etat_processus).pipe_nombre_objets_attente, &pid, sizeof(pid))) != sizeof(pid)) { - 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) @@ -277,12 +288,17 @@ instruction_send(struct_processus *s_eta nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); - 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; } + + scrutation_interruptions(s_etat_processus); } pid = getpid(); @@ -294,10 +310,17 @@ instruction_send(struct_processus *s_eta (*s_etat_processus).pipe_nombre_objets_attente, &pid, sizeof(pid))) != sizeof(pid)) { - 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) @@ -314,17 +337,30 @@ instruction_send(struct_processus *s_eta nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); - 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; } + + scrutation_interruptions(s_etat_processus); } - 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; + } } } else @@ -344,7 +380,11 @@ instruction_send(struct_processus *s_eta attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; - 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; @@ -354,7 +394,11 @@ instruction_send(struct_processus *s_eta (*s_etat_processus).pipe_nombre_objets_attente, &tid, sizeof(tid))) != sizeof(tid)) { - while(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; @@ -374,11 +418,17 @@ instruction_send(struct_processus *s_eta nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); - 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; } + + scrutation_interruptions(s_etat_processus); } tid = pthread_self(); @@ -390,10 +440,17 @@ instruction_send(struct_processus *s_eta (*s_etat_processus).pipe_nombre_objets_attente, &tid, sizeof(tid))) != sizeof(tid)) { - 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) @@ -410,14 +467,24 @@ instruction_send(struct_processus *s_eta nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); - 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; } + + scrutation_interruptions(s_etat_processus); } - if (pthread_mutex_lock(&((*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; @@ -429,7 +496,11 @@ instruction_send(struct_processus *s_eta attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; - 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; @@ -438,26 +509,46 @@ instruction_send(struct_processus *s_eta while(read_atomic(s_etat_processus, (*s_etat_processus).pipe_acquittement, &tampon, 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; + } } nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); - 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; } + + scrutation_interruptions(s_etat_processus); } - 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; + } } // Envoi d'un PID invalide (-1) pour ne pas bloquer le thread @@ -470,7 +561,11 @@ instruction_send(struct_processus *s_eta attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; - 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; @@ -480,7 +575,11 @@ instruction_send(struct_processus *s_eta (*s_etat_processus).pipe_nombre_interruptions_attente, &pid, sizeof(pid))) != sizeof(pid)) { - if (pthread_mutex_lock(&((*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; @@ -500,18 +599,31 @@ instruction_send(struct_processus *s_eta nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); - 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; } } - 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; + } } + + scrutation_interruptions(s_etat_processus); } else { @@ -520,7 +632,11 @@ instruction_send(struct_processus *s_eta attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; - 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; @@ -530,10 +646,17 @@ instruction_send(struct_processus *s_eta (*s_etat_processus).pipe_nombre_interruptions_attente, &tid, sizeof(tid))) != sizeof(tid)) { - 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) @@ -550,23 +673,40 @@ instruction_send(struct_processus *s_eta nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); - 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; } + + scrutation_interruptions(s_etat_processus); } - 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; + } } } // ecriture_pipe() ne peut être interrompu par un signal. - 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; @@ -575,10 +715,17 @@ instruction_send(struct_processus *s_eta if (ecriture_pipe(s_etat_processus, (*s_etat_processus).pipe_donnees, s_objet) == d_erreur) { - 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 ((*s_etat_processus).profilage == d_vrai) @@ -590,10 +737,17 @@ instruction_send(struct_processus *s_eta return; } - 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 ((*s_etat_processus).profilage == d_vrai)