void destroyFposList(fpos_list * list) { if (list == NULL) return; destroyFposList(list->next); delete list; list = NULL; }
// Fix void NoVoHT::merge() { //while(write_lock){} //write_lock=true; sem_wait(&map_lock); sem_wait(&write_lock); char buf[300]; char sec[300]; rewind(dbfile); while (readTabString(dbfile, buf) != NULL) { if (buf[0] == '~') { readTabString(dbfile, sec); char * pos; pos = strtok(sec, ","); while (pos != NULL) { fseek(swapFile, (off_t) atoi(pos), SEEK_SET); char test[300]; readTabString(swapFile, test); if (strcmp(test, (buf + 1)) == 0) { fseek(swapFile, (off_t) atoi(pos), SEEK_SET); fputc('~', swapFile); } pos = strtok(NULL, ","); } } else { //while (map_lock) {} //map_lock = true; //sem_wait(&map_lock); fseek(swapFile, 0, SEEK_END); string s(buf); kvpair* p = kvpairs[hash(s) % size]; while (p != NULL) { if (p->key.compare(s) == 0) { destroyFposList(p->positions); p->positions = new fpos_list; p->positions->next = NULL; fgetpos(swapFile, &(p->positions->pos)); fprintf(swapFile, "%s\t%s\t", p->key.c_str(), p->val.c_str()); p->diff = false; break; } else p = p->next; } //map_lock = false; //sem_post(&map_lock); } } fclose(dbfile); dbfile = swapFile; rewriting = false; sem_post(&map_lock); sem_post(&write_lock); }
// Fix void NoVoHT::rewriteFile(void *args){ //write_lock=true; for (int i=0; i<size;i++){ kvpair *cur = kvpairs[i]; while (cur != NULL){ if(!cur->diff){ destroyFposList(cur->positions); cur->positions = new fpos_list; cur->positions->next = NULL; fgetpos(swapFile, &(cur->positions->pos)); fprintf(swapFile, "%s\t%s\t", cur->key.c_str(), cur->val.c_str()); } cur = cur->next; } } merge(); pthread_exit(NULL); }
//success 0 fail -2 //write kvpair to file //Test int NoVoHT::write(kvpair * p) { //while (write_lock) { //int semv; //sem_getvalue(&map_lock, &semv); //printf("released = %d\n", semv); if (!dbfile) return (filename.compare("") == 0 ? 0 : -2); //write_lock = true; sem_wait(&write_lock); fseek(dbfile, 0, SEEK_END); if (p->positions != NULL) destroyFposList(p->positions); p->positions = new fpos_list; p->positions->next = NULL; fgetpos(dbfile, &(p->positions->pos)); fprintf(dbfile, "%s\t%s\t", p->key.c_str(), p->val.c_str()); fflush(dbfile); //write_lock = false; sem_post(&write_lock); return 0; }
void delete_kvpair(kvpair * redshirt) { destroyFposList(redshirt->positions); delete redshirt; redshirt = NULL; }