--- rpl/src/instructions_r4.c 2011/04/14 08:46:46 1.28.2.2 +++ rpl/src/instructions_r4.c 2011/04/17 14:01:23 1.28.2.3 @@ -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 "); @@ -2037,9 +2034,11 @@ instruction_read(struct_processus *s_eta } } +printf("<1>\n"); if ((*((struct_socket *) (*s_objet_argument_1).objet)).binaire == 'N') { // Socket formatée longueur_questure = 256; +printf("<2>\n"); do { @@ -2065,6 +2064,9 @@ instruction_read(struct_processus *s_eta } # endif + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; + for(;;) { if ((*((struct_socket *) (*s_objet_argument_1).objet)) @@ -2136,14 +2138,15 @@ instruction_read(struct_processus *s_eta return; } - if (longueur_effective < 0) + if (longueur_effective <= 0) { nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); scrutation_injection(s_etat_processus); } if (((*s_etat_processus).var_volatile_requete_arret == -1) - || (longueur_effective >= 0)) + || (longueur_effective > 0)) { break; } @@ -2353,8 +2356,9 @@ 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); +printf("<%s>\n", tampon_lecture); (*s_objet_adresse).objet = NULL; } @@ -2364,7 +2368,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 +2448,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 = @@ -2569,6 +2573,9 @@ instruction_read(struct_processus *s_eta } # endif + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; + for(;;) { if ((*((struct_socket *) (*s_objet_argument_1).objet)) @@ -2643,6 +2650,7 @@ instruction_read(struct_processus *s_eta if (longueur_effective < 0) { nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); scrutation_injection(s_etat_processus); } @@ -2790,7 +2798,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 +2809,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,