--- rpl/src/instructions_s9.c 2011/09/14 17:55:59 1.38 +++ rpl/src/instructions_s9.c 2011/09/20 09:51:43 1.41 @@ -854,7 +854,7 @@ instruction_suspend(struct_processus *s_ } } - if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) != 0) + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -873,10 +873,13 @@ instruction_suspend(struct_processus *s_ INCR_GRANULARITE(attente.tv_nsec); } - if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) { - (*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) @@ -1235,7 +1238,7 @@ instruction_swi(struct_processus *s_etat attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; - if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) != 0) + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1245,10 +1248,13 @@ instruction_swi(struct_processus *s_etat (*s_etat_processus).pipe_nombre_objets_attente, &pid, sizeof(pid))) != sizeof(pid)) { - if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) { - (*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) @@ -1273,7 +1279,7 @@ instruction_swi(struct_processus *s_etat nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); - if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -1281,10 +1287,15 @@ instruction_swi(struct_processus *s_etat } } - if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) + scrutation_interruptions(s_etat_processus); + + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } } } else @@ -1294,7 +1305,7 @@ instruction_swi(struct_processus *s_etat attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; - if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) != 0) + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1304,10 +1315,13 @@ instruction_swi(struct_processus *s_etat (*s_etat_processus).pipe_nombre_objets_attente, &tid, sizeof(tid))) != sizeof(tid)) { - if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) { - (*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) @@ -1332,18 +1346,22 @@ instruction_swi(struct_processus *s_etat nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); - if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) - != 0) + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } - if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) + scrutation_interruptions(s_etat_processus); + + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } } } @@ -1352,7 +1370,7 @@ instruction_swi(struct_processus *s_etat attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; - if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) != 0) + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1363,10 +1381,13 @@ instruction_swi(struct_processus *s_etat &interruption_reduite, sizeof(interruption_reduite))) != sizeof(interruption_reduite)) { - if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) { - (*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) @@ -1391,17 +1412,22 @@ instruction_swi(struct_processus *s_etat nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); - if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) != 0) + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } + + scrutation_interruptions(s_etat_processus); } - if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) { - (*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).processus_detache == d_vrai) @@ -1411,7 +1437,7 @@ instruction_swi(struct_processus *s_etat attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; - if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) != 0) + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1421,10 +1447,13 @@ instruction_swi(struct_processus *s_etat (*s_etat_processus).pipe_nombre_interruptions_attente, &pid, sizeof(pid))) != sizeof(pid)) { - if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) { - (*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) @@ -1449,12 +1478,13 @@ instruction_swi(struct_processus *s_etat nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); - if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) - != 0) + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } + + scrutation_interruptions(s_etat_processus); } pid = getpid(); @@ -1466,10 +1496,13 @@ instruction_swi(struct_processus *s_etat (*s_etat_processus).pipe_nombre_interruptions_attente, &pid, sizeof(pid))) != sizeof(pid)) { - if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) { - (*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) @@ -1494,25 +1527,27 @@ instruction_swi(struct_processus *s_etat nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); - if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) - != 0) + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } - if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } } } else { tid = -3; - if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) != 0) + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1522,10 +1557,13 @@ instruction_swi(struct_processus *s_etat (*s_etat_processus).pipe_nombre_interruptions_attente, &tid, sizeof(tid))) != sizeof(tid)) { - if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) { - (*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) @@ -1550,12 +1588,13 @@ instruction_swi(struct_processus *s_etat nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); - if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) - != 0) + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } + + scrutation_interruptions(s_etat_processus); } tid = pthread_self(); @@ -1567,10 +1606,13 @@ instruction_swi(struct_processus *s_etat (*s_etat_processus).pipe_nombre_interruptions_attente, &tid, sizeof(tid))) != sizeof(tid)) { - if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) { - (*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) @@ -1596,25 +1638,29 @@ instruction_swi(struct_processus *s_etat nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); - if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) - != 0) + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } + + scrutation_interruptions(s_etat_processus); } - if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } } } attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; - if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) != 0) + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -1624,26 +1670,34 @@ instruction_swi(struct_processus *s_etat (*s_etat_processus).pipe_acquittement, &tampon, sizeof(unsigned char)) != sizeof(unsigned char)) { - if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) { - (*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) + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } + + scrutation_interruptions(s_etat_processus); } - if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } } if (registre == 0)