--- rpl/src/instructions_s8.c 2013/03/21 11:30:30 1.57 +++ rpl/src/instructions_s8.c 2015/02/19 11:01:27 1.69 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.13 - Copyright (C) 1989-2013 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.21 + Copyright (C) 1989-2015 Dr. BERTRAND Joël This file is part of RPL/2. @@ -133,10 +133,6 @@ instruction_splash(struct_processus *s_e void instruction_send(struct_processus *s_etat_processus) { - pid_t pid; - - pthread_t tid; - sig_atomic_t registre; ssize_t longueur_ecriture; @@ -145,6 +141,7 @@ instruction_send(struct_processus *s_eta struct timespec attente; + unsigned char caractere; unsigned char tampon; (*s_etat_processus).erreur_execution = d_ex; @@ -242,11 +239,6 @@ instruction_send(struct_processus *s_eta } } - pid = -3; - - attente.tv_sec = 0; - attente.tv_nsec = GRANULARITE_us * 1000; - # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) # else @@ -257,58 +249,14 @@ instruction_send(struct_processus *s_eta return; } - while((longueur_ecriture = write_atomic(s_etat_processus, - (*s_etat_processus).pipe_nombre_objets_attente, - &pid, sizeof(pid))) != sizeof(pid)) - { -# 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 (longueur_ecriture == -1) - { - if ((*s_etat_processus).profilage == d_vrai) - { - profilage(s_etat_processus, NULL); - } - - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - - nanosleep(&attente, NULL); - INCR_GRANULARITE(attente.tv_nsec); - -# 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(); + caractere = 1; attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; while((longueur_ecriture = write_atomic(s_etat_processus, - (*s_etat_processus).pipe_nombre_objets_attente, - &pid, sizeof(pid))) != sizeof(pid)) + (*s_etat_processus).pipe_nombre_elements_attente, + &caractere, sizeof(caractere))) != sizeof(caractere)) { # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) @@ -375,8 +323,6 @@ instruction_send(struct_processus *s_eta } } - tid = (pthread_t) -3; - attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; @@ -390,55 +336,14 @@ instruction_send(struct_processus *s_eta return; } - while((longueur_ecriture = write_atomic(s_etat_processus, - (*s_etat_processus).pipe_nombre_objets_attente, - &tid, sizeof(tid))) != sizeof(tid)) - { -# 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 (longueur_ecriture == -1) - { - if ((*s_etat_processus).profilage == d_vrai) - { - profilage(s_etat_processus, NULL); - } - - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - - nanosleep(&attente, NULL); - INCR_GRANULARITE(attente.tv_nsec); - -# 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(); + caractere = 1; attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; while((longueur_ecriture = write_atomic(s_etat_processus, - (*s_etat_processus).pipe_nombre_objets_attente, - &tid, sizeof(tid))) != sizeof(tid)) + (*s_etat_processus).pipe_nombre_elements_attente, + &caractere, sizeof(caractere))) != sizeof(caractere)) { # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) @@ -551,155 +456,6 @@ instruction_send(struct_processus *s_eta } } - // Envoi d'un PID invalide (-1) pour ne pas bloquer le thread - // de surveillance. - - if ((*s_etat_processus).processus_detache == d_vrai) - { - pid = -1; - - attente.tv_sec = 0; - attente.tv_nsec = GRANULARITE_us * 1000; - -# 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; - } - - while((longueur_ecriture = write_atomic(s_etat_processus, - (*s_etat_processus).pipe_nombre_interruptions_attente, - &pid, sizeof(pid))) != sizeof(pid)) - { -# 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 (longueur_ecriture == -1) - { - if ((*s_etat_processus).profilage == d_vrai) - { - profilage(s_etat_processus, NULL); - } - - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - - nanosleep(&attente, NULL); - INCR_GRANULARITE(attente.tv_nsec); - -# 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; - } - } - -# 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; - } - } - - scrutation_interruptions(s_etat_processus); - } - else - { - tid = (pthread_t) -1; - - attente.tv_sec = 0; - attente.tv_nsec = GRANULARITE_us * 1000; - -# 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; - } - - while((longueur_ecriture = write_atomic(s_etat_processus, - (*s_etat_processus).pipe_nombre_interruptions_attente, - &tid, sizeof(tid))) != sizeof(tid)) - { -# 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 (longueur_ecriture == -1) - { - if ((*s_etat_processus).profilage == d_vrai) - { - profilage(s_etat_processus, NULL); - } - - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - - nanosleep(&attente, NULL); - INCR_GRANULARITE(attente.tv_nsec); - -# 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); - } - -# 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; - } - } - } - // ecriture_pipe() ne peut être interrompu par un signal. # ifndef SEMAPHORES_NOMMES @@ -1764,7 +1520,8 @@ instruction_stop(struct_processus *s_eta } else { - 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; @@ -1806,8 +1563,8 @@ instruction_stop(struct_processus *s_eta if (pthread_mutex_lock(&((*(*((struct_processus_fils *) (*s_objet).objet)).thread).mutex)) != 0) { - 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; @@ -1827,8 +1584,8 @@ instruction_stop(struct_processus *s_eta if (pthread_mutex_unlock(&((*(*((struct_processus_fils *) (*s_objet).objet)).thread).mutex)) != 0) { - 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; @@ -1840,7 +1597,8 @@ instruction_stop(struct_processus *s_eta } } - 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;