--- rpl/src/instructions_w1.c 2012/12/19 09:58:27 1.69 +++ rpl/src/instructions_w1.c 2012/12/21 12:09:50 1.70 @@ -385,6 +385,7 @@ instruction_write(struct_processus *s_et int adresse[16]; int port; + int sqlite_status; integer8 clef; integer8 compteur; @@ -424,6 +425,8 @@ instruction_write(struct_processus *s_et struct flock lock; + struct timespec attente; + uint32_t calcul_adresse; unsigned char *chaine; @@ -760,11 +763,30 @@ instruction_write(struct_processus *s_et 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; - } + sqlite_status = sqlite3_step(ppStmt); + + if (sqlite_status == SQLITE_ROW) + { + break; + } + else if ((sqlite_status == SQLITE_BUSY) || + (sqlite_status == SQLITE_LOCKED)) + { + nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); + } + else + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + } while(sqlite_status != SQLITE_ROW); if (sqlite3_column_type(ppStmt, 0) != SQLITE_INTEGER) { @@ -917,100 +939,107 @@ instruction_write(struct_processus *s_et return; } - switch(sqlite3_step(ppStmt)) - { - case SQLITE_ROW: - { - // Une clef existe. - - mise_a_jour = d_vrai; - break; - } + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; - case SQLITE_DONE: + do + { + switch(sqlite_status = sqlite3_step(ppStmt)) { - // Aucune clef n'existe. - - mise_a_jour = d_faux; - - if (sqlite3_finalize(ppStmt) != SQLITE_OK) - { - (*s_etat_processus).erreur_systeme = - d_es_erreur_fichier; - return; - } - - free(commande); - - if (alsprintf(&commande, "insert into key " - "(key) values ('%s')", clef_utf8) < 0) + case SQLITE_ROW: { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return; - } + // Une clef existe. - if (sqlite3_prepare_v2((*descripteur) - .descripteur_sqlite, - commande, strlen(commande), &ppStmt, &queue) - != SQLITE_OK) - { - (*s_etat_processus).erreur_systeme = - d_es_erreur_fichier; - return; + mise_a_jour = d_vrai; + break; } - if (sqlite3_step(ppStmt) != SQLITE_DONE) + case SQLITE_DONE: { - (*s_etat_processus).erreur_systeme = - d_es_erreur_fichier; - return; - } + // Aucune clef n'existe. - if (sqlite3_finalize(ppStmt) != SQLITE_OK) - { - (*s_etat_processus).erreur_systeme = - d_es_erreur_fichier; - return; - } + mise_a_jour = d_faux; - free(commande); + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + free(commande); + + if (alsprintf(&commande, "insert into key " + "(key) values ('%s')", clef_utf8) < 0) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + if (sqlite3_prepare_v2((*descripteur) + .descripteur_sqlite, + commande, strlen(commande), &ppStmt, &queue) + != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + if (sqlite3_step(ppStmt) != SQLITE_DONE) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + free(commande); + + if (alsprintf(&commande, "select id from key " + "where key = '%s'", clef_utf8) < 0) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + if (sqlite3_prepare_v2((*descripteur) + .descripteur_sqlite, + commande, strlen(commande), &ppStmt, &queue) + != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } - if (alsprintf(&commande, "select id from key " - "where key = '%s'", clef_utf8) < 0) - { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return; + break; } - if (sqlite3_prepare_v2((*descripteur) - .descripteur_sqlite, - commande, strlen(commande), &ppStmt, &queue) - != SQLITE_OK) + case SQLITE_BUSY: + case SQLITE_LOCKED: { - (*s_etat_processus).erreur_systeme = - d_es_erreur_fichier; - return; + nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); + break; } - if (sqlite3_step(ppStmt) != SQLITE_ROW) + default: { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } - - break; } - - default: - { - (*s_etat_processus).erreur_systeme = - d_es_erreur_fichier; - return; - } - } + } while(sqlite_status != SQLITE_ROW); if (sqlite3_column_type(ppStmt, 0) != SQLITE_INTEGER) {