--- rpl/src/instructions_r4.c 2012/06/22 10:12:19 1.59 +++ rpl/src/instructions_r4.c 2013/02/26 19:56:15 1.69 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.9 - Copyright (C) 1989-2012 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.12 + Copyright (C) 1989-2013 Dr. BERTRAND Joël This file is part of RPL/2. @@ -1313,42 +1313,58 @@ instruction_read(struct_processus *s_eta (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } - - switch(sqlite3_step(ppStmt)) + + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; + + do { - case SQLITE_ROW: - { - // Résultat attendu - break; - } + ios = sqlite3_step(ppStmt); - case SQLITE_DONE: + switch(ios) { - // Aucun enregistrement - if (sqlite3_finalize(ppStmt) != SQLITE_OK) + case SQLITE_ROW: { - (*s_etat_processus).erreur_systeme = - d_es_erreur_fichier; - return; + // Résultat attendu + break; } - free(commande); + case SQLITE_DONE: + { + // Aucun enregistrement + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } - liberation(s_etat_processus, s_objet_argument_1); - liberation(s_etat_processus, s_objet_argument_2); + free(commande); - (*s_etat_processus).erreur_execution = - d_ex_enregistrement_inexistant; - return; - } + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_argument_2); - default: - { - (*s_etat_processus).erreur_systeme = - d_es_erreur_fichier; - return; + (*s_etat_processus).erreur_execution = + d_ex_enregistrement_inexistant; + return; + } + + case SQLITE_BUSY: + case SQLITE_LOCKED: + { + nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); + break; + } + + default: + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } } - } + } while(ios != SQLITE_ROW); if (sqlite3_column_type(ppStmt, 0) != SQLITE_TEXT) { @@ -1469,11 +1485,29 @@ instruction_read(struct_processus *s_eta return; } - if (sqlite3_step(ppStmt) != SQLITE_ROW) + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; + + do { - (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; - return; - } + ios = sqlite3_step(ppStmt); + + if (ios == SQLITE_ROW) + { + break; + } + else if ((ios == SQLITE_BUSY) || (ios == SQLITE_LOCKED)) + { + nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); + } + else + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + } while(ios != SQLITE_ROW); if (sqlite3_column_type(ppStmt, 0) != SQLITE_INTEGER) { @@ -1525,42 +1559,58 @@ instruction_read(struct_processus *s_eta return; } - switch(sqlite3_step(ppStmt)) + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; + + do { - case SQLITE_ROW: - { - // Résultat attendu : une clef correspond. - break; - } + ios = sqlite3_step(ppStmt); - case SQLITE_DONE: + switch(ios) { - // Aucun enregistrement - if (sqlite3_finalize(ppStmt) != SQLITE_OK) + case SQLITE_ROW: { - (*s_etat_processus).erreur_systeme = - d_es_erreur_fichier; - return; + // Résultat attendu : une clef correspond. + break; } - free(clef_utf8); - free(commande); + case SQLITE_DONE: + { + // Aucun enregistrement + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } - liberation(s_etat_processus, s_objet_argument_1); - liberation(s_etat_processus, s_objet_argument_2); + free(clef_utf8); + free(commande); - (*s_etat_processus).erreur_execution = - d_ex_enregistrement_inexistant; - return; - } + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_argument_2); - default: - { - (*s_etat_processus).erreur_systeme = - d_es_erreur_fichier; - return; + (*s_etat_processus).erreur_execution = + d_ex_enregistrement_inexistant; + return; + } + + case SQLITE_BUSY: + case SQLITE_LOCKED: + { + nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); + break; + } + + default: + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } } - } + } while(ios != SQLITE_ROW); if (sqlite3_column_type(ppStmt, 0) != SQLITE_INTEGER) { @@ -1604,6 +1654,9 @@ instruction_read(struct_processus *s_eta element = 1; + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; + do { switch(ios = sqlite3_step(ppStmt)) @@ -1782,6 +1835,14 @@ instruction_read(struct_processus *s_eta break; } + case SQLITE_BUSY: + case SQLITE_LOCKED: + { + nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); + break; + } + default: { (*s_etat_processus).erreur_systeme = @@ -1789,7 +1850,6 @@ instruction_read(struct_processus *s_eta return; } } - } while(ios != SQLITE_DONE); if (sqlite3_finalize(ppStmt) != SQLITE_OK) @@ -2108,7 +2168,7 @@ printf("L=%d\n", longueur_enregistrement longueur = strlen(format_chaine); - if (format_chaine[longueur] != ')') + if (format_chaine[longueur - 1] != ')') { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_resultat); @@ -2427,7 +2487,11 @@ printf("L=%d\n", longueur_enregistrement if ((*s_etat_processus).var_volatile_requete_arret == -1) { - longueur_effective += ios; + if (ios >= 0) + { + longueur_effective += ios; + } + break; } @@ -2522,8 +2586,7 @@ printf("L=%d\n", longueur_enregistrement - ancienne_longueur_effective, MSG_DONTWAIT, (struct sockaddr *) &adresse_unix, &longueur_adresse); - } - while((ios == -1) && (errno == EINTR)); + } while((ios == -1) && (errno == EINTR)); } else if ((*((struct_socket *) (*s_objet_argument_1) .objet)).domaine == PF_INET) @@ -2538,8 +2601,7 @@ printf("L=%d\n", longueur_enregistrement - ancienne_longueur_effective, MSG_DONTWAIT, (struct sockaddr *) &adresse_ipv4, &longueur_adresse); - } - while((ios == -1) && (errno == EINTR)); + } while((ios == -1) && (errno == EINTR)); } else if ((*((struct_socket *) (*s_objet_argument_1) .objet)) .domaine == PF_INET6) @@ -2555,8 +2617,7 @@ printf("L=%d\n", longueur_enregistrement - ancienne_longueur_effective, MSG_DONTWAIT, (struct sockaddr *) &adresse_ipv6, &longueur_adresse); - } - while((ios == -1) && (errno == EINTR)); + } while((ios == -1) && (errno == EINTR)); # else if ((*s_etat_processus).langue == 'F') { @@ -2579,7 +2640,7 @@ printf("L=%d\n", longueur_enregistrement (*s_objet_argument_1).objet)).socket; poll_fd.events = POLLIN; - while((ios = poll(&poll_fd, 1, 100)) <= 0) + while((ios = poll(&poll_fd, 1, 10000)) <= 0) { // La fin de la trame n'est pas atteinte // et il reste quelque chose à lire. @@ -2588,6 +2649,15 @@ printf("L=%d\n", longueur_enregistrement { case EINTR: { + if ((*s_etat_processus) + .var_volatile_requete_arret == -1) + { + liberation(s_etat_processus, + s_objet_argument_1); + free(tampon_lecture); + return; + } + break; }