--- rpl/src/instructions_r4.c 2011/03/12 15:32:03 1.28 +++ rpl/src/instructions_r4.c 2011/09/14 17:55:59 1.41 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.21 + RPL/2 (R) version 4.1.3 Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -903,9 +903,6 @@ instruction_read(struct_processus *s_eta (*s_etat_processus).erreur_execution = d_ex; - attente.tv_sec = 0; - attente.tv_nsec = GRANULARITE_us * 1000; - if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n READ "); @@ -2051,19 +2048,15 @@ instruction_read(struct_processus *s_eta return; } -# ifndef SEMAPHORES_NOMMES - if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) + if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) + != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } -# else - if (sem_post((*s_etat_processus).semaphore_fork) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } -# endif + + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; for(;;) { @@ -2097,6 +2090,7 @@ instruction_read(struct_processus *s_eta tampon_lecture, longueur_questure, MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *) &adresse_ipv6, &longueur_adresse); + # else if ((*s_etat_processus).langue == 'F') { @@ -2115,20 +2109,11 @@ instruction_read(struct_processus *s_eta free(tampon_lecture); liberation(s_etat_processus, s_objet_argument_1); -# ifndef SEMAPHORES_NOMMES - while(sem_wait(&((*s_etat_processus) - .semaphore_fork)) == -1) -# else - while(sem_wait((*s_etat_processus) - .semaphore_fork) == -1) -# endif + while(pthread_mutex_lock(&((*s_etat_processus) + .mutex_fork)) != 0) { - if (errno != EINTR) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return; - } + (*s_etat_processus).erreur_systeme = + d_es_processus; } (*s_etat_processus).erreur_execution = @@ -2139,9 +2124,12 @@ instruction_read(struct_processus *s_eta if (longueur_effective < 0) { nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); scrutation_injection(s_etat_processus); } + // Une donnée a été reçue. + if (((*s_etat_processus).var_volatile_requete_arret == -1) || (longueur_effective >= 0)) { @@ -2149,17 +2137,10 @@ instruction_read(struct_processus *s_eta } } -# ifndef SEMAPHORES_NOMMES - while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) -# else - while(sem_wait((*s_etat_processus).semaphore_fork) == -1) -# endif + if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) { - if (errno != EINTR) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } + (*s_etat_processus).erreur_systeme = d_es_processus; + return; } if ((*s_etat_processus).var_volatile_requete_arret == -1) @@ -2353,7 +2334,7 @@ instruction_read(struct_processus *s_eta longueur_adresse = 0; recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, tampon_lecture, - position_finale, MSG_DONTWAIT, + longueur_effective, MSG_DONTWAIT, NULL, &longueur_adresse); (*s_objet_adresse).objet = NULL; @@ -2364,7 +2345,7 @@ instruction_read(struct_processus *s_eta longueur_adresse = sizeof(adresse_ipv4); recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, tampon_lecture, - position_finale, MSG_DONTWAIT, + longueur_effective, MSG_DONTWAIT, (struct sockaddr *) &adresse_ipv4, &longueur_adresse); if (((*s_objet_adresse).objet = @@ -2444,7 +2425,7 @@ instruction_read(struct_processus *s_eta longueur_adresse = sizeof(adresse_ipv6); recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, tampon_lecture, - position_finale, MSG_DONTWAIT, + longueur_effective, MSG_DONTWAIT, (struct sockaddr *) &adresse_ipv6, &longueur_adresse); if (((*s_objet_adresse).objet = @@ -2555,19 +2536,15 @@ instruction_read(struct_processus *s_eta return; } -# ifndef SEMAPHORES_NOMMES - if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } -# else - if (sem_post((*s_etat_processus).semaphore_fork) != 0) + if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) + != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } -# endif + + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; for(;;) { @@ -2619,20 +2596,12 @@ instruction_read(struct_processus *s_eta free(tampon_lecture); liberation(s_etat_processus, s_objet_argument_1); -# ifndef SEMAPHORES_NOMMES - while(sem_wait(&((*s_etat_processus) - .semaphore_fork)) == -1) -# else - while(sem_wait((*s_etat_processus) - .semaphore_fork) == -1) -# endif + if (pthread_mutex_lock(&((*s_etat_processus) + .mutex_fork)) != 0) { - if (errno != EINTR) - { - (*s_etat_processus).erreur_systeme = - d_es_processus; - return; - } + (*s_etat_processus).erreur_systeme = + d_es_processus; + return; } (*s_etat_processus).erreur_execution = @@ -2643,6 +2612,7 @@ instruction_read(struct_processus *s_eta if (longueur_effective < 0) { nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); scrutation_injection(s_etat_processus); } @@ -2653,17 +2623,11 @@ instruction_read(struct_processus *s_eta } } -# ifndef SEMAPHORES_NOMMES - while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) -# else - while(sem_wait((*s_etat_processus).semaphore_fork) == -1) -# endif + if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) + != 0) { - if (errno != EINTR) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } + (*s_etat_processus).erreur_systeme = d_es_processus; + return; } if ((*s_etat_processus).var_volatile_requete_arret == -1) @@ -2790,7 +2754,8 @@ instruction_read(struct_processus *s_eta /* * Les informations concernant la cible sont valides si - * la socket est non connectée et des domaines INET ou INET6. + * la socket est non connectée et que les domaines sont + * INET ou INET6. * Dans tous les autres cas, on renvoie une liste vide. */ @@ -2800,6 +2765,8 @@ instruction_read(struct_processus *s_eta (strcmp((*((struct_socket *) (*s_objet_argument_1).objet)) .type, "SEQUENTIAL DATAGRAM") == 0)) { + // POSITION_FINALE peut être utilisée sans être initialisée ! + // virer position_finale pour longueur_effective longueur_adresse = 0; recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, tampon_lecture,