Skip to content

Commit

Permalink
refcounter: delete, use rwlock instead
Browse files Browse the repository at this point in the history
  • Loading branch information
indutny committed Jan 26, 2012
1 parent 13c65d9 commit 5fc9530
Show file tree
Hide file tree
Showing 10 changed files with 72 additions and 167 deletions.
2 changes: 0 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ ifneq ($(SNAPPY),0)
endif

OBJS += src/threads.o
OBJS += src/refcounter.o
OBJS += src/compressor.o
OBJS += src/utils.o
OBJS += src/writer.o
Expand All @@ -49,7 +48,6 @@ DEPS=
DEPS += include/bplus.h
DEPS += include/private/errors.h
DEPS += include/private/threads.h
DEPS += include/private/refcounter.h
DEPS += include/private/pages.h
DEPS += include/private/values.h
DEPS += include/private/tree.h
Expand Down
5 changes: 3 additions & 2 deletions include/private/errors.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@
#define BP_ECOMP 0x201
#define BP_EDECOMP 0x202

#define BP_EALLOC 0x301
#define BP_EMUTEX 0x302
#define BP_EALLOC 0x301
#define BP_EMUTEX 0x302
#define BP_ERWLOCK 0x303

#define BP_ENOTFOUND 0x401
#define BP_ESPLITPAGE 0x402
Expand Down
40 changes: 0 additions & 40 deletions include/private/refcounter.h

This file was deleted.

7 changes: 7 additions & 0 deletions include/private/threads.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,20 @@ extern "C" {
#include <pthread.h>

typedef pthread_mutex_t bp__mutex_t;
typedef pthread_rwlock_t bp__rwlock_t;


int bp__mutex_init(bp__mutex_t* mutex);
void bp__mutex_destroy(bp__mutex_t* mutex);
void bp__mutex_lock(bp__mutex_t* mutex);
void bp__mutex_unlock(bp__mutex_t* mutex);

int bp__rwlock_init(bp__rwlock_t* rwlock);
void bp__rwlock_destroy(bp__rwlock_t* rwlock);
void bp__rwlock_rdlock(bp__rwlock_t* rwlock);
void bp__rwlock_wrlock(bp__rwlock_t* rwlock);
void bp__rwlock_unlock(bp__rwlock_t* rwlock);

#ifdef __cplusplus
} /* extern "C" */
#endif
Expand Down
9 changes: 3 additions & 6 deletions include/private/tree.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,22 @@
extern "C" {
#endif

#include "private/threads.h"
#include "private/writer.h"
#include "private/pages.h"

#define BP__HEAD_SIZE sizeof(uint64_t) * 4

#define BP_TREE_PRIVATE\
BP_WRITER_PRIVATE\
bp__rwlock_t rwlock;\
bp__tree_head_t head;\
bp_compare_cb compare_cb;

typedef struct bp__tree_head_s bp__tree_head_t;

enum bp__destroy_type {
kNoClose,
kClose
};

int bp__init(bp_db_t* tree);
void bp__destroy(bp_db_t* tree, const enum bp__destroy_type type);
void bp__destroy(bp_db_t* tree);

int bp__tree_read_head(bp__writer_t* w, void* data);
int bp__tree_write_head(bp__writer_t* w, void* data);
Expand Down
4 changes: 0 additions & 4 deletions include/private/writer.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
#define _PRIVATE_WRITER_H_

#include <stdint.h>
#include "private/refcounter.h"
#include "private/threads.h"

#ifdef __cplusplus
Expand All @@ -13,7 +12,6 @@ extern "C" {
#define _XOPEN_SOURCE 600

#define BP_WRITER_PRIVATE \
BP__REF_PRIVATE\
int fd;\
char* filename;\
uint64_t filesize;\
Expand All @@ -29,8 +27,6 @@ enum comp_type {

int bp__writer_create(bp__writer_t* w, const char* filename);
int bp__writer_destroy(bp__writer_t* w);
int bp__writer_open(bp__writer_t* w, const char* filename);
int bp__writer_close(bp__writer_t* w);

int bp__writer_fsync(bp__writer_t* w);

Expand Down
57 changes: 31 additions & 26 deletions src/bplus.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,29 @@

int bp_open(bp_db_t* tree, const char* filename) {
int ret;
ret = bp__writer_create((bp__writer_t*) tree, filename);

ret = bp__rwlock_init(&tree->rwlock);
if (ret != BP_OK) return ret;

ret = bp__writer_create((bp__writer_t*) tree, filename);
if (ret != BP_OK) goto fatal;

tree->head.page = NULL;

return bp__init(tree);
}
ret = bp__init(tree);
if (ret != BP_OK) goto fatal;

return BP_OK;

int bp_close(bp_db_t* tree) {
int ret;
fatal:
bp__rwlock_destroy(&tree->rwlock);
return ret;
}

ret = bp__writer_destroy((bp__writer_t*) tree);
if (ret != BP_OK) return ret;

bp__destroy(tree, kNoClose);
int bp_close(bp_db_t* tree) {
bp__rwlock_destroy(&tree->rwlock);
bp__destroy(tree);

return BP_OK;
}
Expand Down Expand Up @@ -50,10 +57,8 @@ int bp__init(bp_db_t* tree) {
}


void bp__destroy(bp_db_t* tree, const enum bp__destroy_type type) {
if (type == kClose) {
bp__writer_close((bp__writer_t*) tree);
}
void bp__destroy(bp_db_t* tree) {
bp__writer_destroy((bp__writer_t*) tree);
if (tree->head.page != NULL) {
bp__page_destroy(tree, tree->head.page);
tree->head.page = NULL;
Expand All @@ -64,11 +69,11 @@ void bp__destroy(bp_db_t* tree, const enum bp__destroy_type type) {
int bp_get(bp_db_t* tree, const bp_key_t* key, bp_value_t* value) {
int ret;

bp__ref((bp__ref_t*) tree);
bp__rwlock_rdlock(&tree->rwlock);

ret = bp__page_get(tree, tree->head.page, key, value);

bp__unref((bp__ref_t*) tree);
bp__rwlock_unlock(&tree->rwlock);

return ret;
}
Expand All @@ -90,13 +95,13 @@ int bp_get_previous(bp_db_t* tree,
int bp_set(bp_db_t* tree, const bp_key_t* key, const bp_value_t* value) {
int ret;

bp__ref_close((bp__ref_t*) tree);
bp__rwlock_wrlock(&tree->rwlock);

ret = bp__page_insert(tree, tree->head.page, key, value);
if (ret != BP_OK) return ret;
ret = bp__tree_write_head((bp__writer_t*) tree, NULL);

bp__ref_open((bp__ref_t*) tree);
bp__rwlock_unlock(&tree->rwlock);

return ret;
}
Expand All @@ -111,7 +116,7 @@ int bp_bulk_set(bp_db_t* tree,
bp_value_t* values_iter = (bp_value_t*) *values;
uint64_t left = count;

bp__ref_close((bp__ref_t*) tree);
bp__rwlock_wrlock(&tree->rwlock);

ret = bp__page_bulk_insert(tree,
tree->head.page,
Expand All @@ -122,7 +127,7 @@ int bp_bulk_set(bp_db_t* tree,
if (ret != BP_OK) return ret;
ret = bp__tree_write_head((bp__writer_t*) tree, NULL);

bp__ref_open((bp__ref_t*) tree);
bp__rwlock_unlock(&tree->rwlock);

return ret;
}
Expand All @@ -131,13 +136,13 @@ int bp_bulk_set(bp_db_t* tree,
int bp_remove(bp_db_t* tree, const bp_key_t* key) {
int ret;

bp__ref_close((bp__ref_t*) tree);
bp__rwlock_wrlock(&tree->rwlock);

ret = bp__page_remove(tree, tree->head.page, key);
if (ret != BP_OK) return ret;
ret = bp__tree_write_head((bp__writer_t*) tree, NULL);

bp__ref_open((bp__ref_t*) tree);
bp__rwlock_unlock(&tree->rwlock);

return ret;
}
Expand All @@ -160,12 +165,12 @@ int bp_compact(bp_db_t* tree) {
/* destroy stub head page */
bp__page_destroy(&compacted, compacted.head.page);

bp__ref((bp__ref_t*) tree);
bp__rwlock_rdlock(&tree->rwlock);

/* clone source tree's head page */
ret = bp__page_clone(&compacted, tree->head.page, &compacted.head.page);

bp__unref((bp__ref_t*) tree);
bp__rwlock_unlock(&tree->rwlock);

/* copy all pages starting from head */
ret = bp__page_copy(tree, &compacted, compacted.head.page);
Expand All @@ -175,11 +180,11 @@ int bp_compact(bp_db_t* tree) {
compacted.head.page = NULL;
if (ret != BP_OK) return ret;

bp__ref_close((bp__ref_t*) tree);
bp__rwlock_wrlock(&tree->rwlock);

ret = bp__writer_compact_finalize((bp__writer_t*) tree,
(bp__writer_t*) &compacted);
bp__ref_open((bp__ref_t*) tree);
bp__rwlock_unlock(&tree->rwlock);

return ret;
}
Expand All @@ -193,7 +198,7 @@ int bp_get_filtered_range(bp_db_t* tree,
void* arg) {
int ret;

bp__ref((bp__ref_t*) tree);
bp__rwlock_rdlock(&tree->rwlock);

ret = bp__page_get_range(tree,
tree->head.page,
Expand All @@ -203,7 +208,7 @@ int bp_get_filtered_range(bp_db_t* tree,
cb,
arg);

bp__unref((bp__ref_t*) tree);
bp__rwlock_unlock(&tree->rwlock);

return ret;
}
Expand Down
65 changes: 0 additions & 65 deletions src/refcounter.c

This file was deleted.

Loading

0 comments on commit 5fc9530

Please sign in to comment.