Beispiel #1
0
void destroyFposList(fpos_list * list) {
	if (list == NULL)
		return;
	destroyFposList(list->next);
	delete list;
	list = NULL;
}
Beispiel #2
0
// 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);
}
Beispiel #3
0
// 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);
}
Beispiel #4
0
//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;
}
Beispiel #5
0
void delete_kvpair(kvpair * redshirt) {
	destroyFposList(redshirt->positions);
	delete redshirt;
	redshirt = NULL;
}