提交 daa29bca 编写于 作者: H Hongze Cheng

more tdb

上级 e9984c99
...@@ -21,6 +21,7 @@ static void tdbMPoolUnregFile(TDB_MPOOL *mp, TDB_MPFILE *mpf); ...@@ -21,6 +21,7 @@ static void tdbMPoolUnregFile(TDB_MPOOL *mp, TDB_MPFILE *mpf);
static TDB_MPFILE *tdbMPoolGetFile(TDB_MPOOL *mp, uint8_t *fileid); static TDB_MPFILE *tdbMPoolGetFile(TDB_MPOOL *mp, uint8_t *fileid);
static int tdbMPoolFileReadPage(TDB_MPFILE *mpf, pgno_t pgno, void *p); static int tdbMPoolFileReadPage(TDB_MPFILE *mpf, pgno_t pgno, void *p);
static int tdbMPoolFileWritePage(TDB_MPFILE *mpf, pgno_t pgno, const void *p); static int tdbMPoolFileWritePage(TDB_MPFILE *mpf, pgno_t pgno, const void *p);
static void tdbMPoolClockEvictPage(TDB_MPOOL *mp, pg_t **pagepp);
int tdbMPoolOpen(TDB_MPOOL **mpp, uint64_t cachesize, pgsize_t pgsize) { int tdbMPoolOpen(TDB_MPOOL **mpp, uint64_t cachesize, pgsize_t pgsize) {
TDB_MPOOL *mp = NULL; TDB_MPOOL *mp = NULL;
...@@ -44,6 +45,7 @@ int tdbMPoolOpen(TDB_MPOOL **mpp, uint64_t cachesize, pgsize_t pgsize) { ...@@ -44,6 +45,7 @@ int tdbMPoolOpen(TDB_MPOOL **mpp, uint64_t cachesize, pgsize_t pgsize) {
mp->cachesize = cachesize; mp->cachesize = cachesize;
mp->pgsize = pgsize; mp->pgsize = pgsize;
mp->npages = cachesize / pgsize; mp->npages = cachesize / pgsize;
mp->clockHand = 0;
TD_DLIST_INIT(&mp->freeList); TD_DLIST_INIT(&mp->freeList);
...@@ -193,10 +195,11 @@ int tdbMPoolFileGetPage(TDB_MPFILE *mpf, pgno_t pgno, void *addr) { ...@@ -193,10 +195,11 @@ int tdbMPoolFileGetPage(TDB_MPFILE *mpf, pgno_t pgno, void *addr) {
TD_DLIST_POP_WITH_FIELD(&(mp->freeList), pagep, free); TD_DLIST_POP_WITH_FIELD(&(mp->freeList), pagep, free);
} else { } else {
// no free page available // no free page available
// pagep = tdbMpoolEvict(mp); tdbMPoolClockEvictPage(mp, &pagep);
if (pagep) { if (pagep) {
} else { if (pagep->dirty) {
// TODO: Cannot find a page to evict // TODO: Handle dirty page eviction
}
} }
} }
...@@ -346,4 +349,31 @@ static int tdbMPoolFileWritePage(TDB_MPFILE *mpf, pgno_t pgno, const void *p) { ...@@ -346,4 +349,31 @@ static int tdbMPoolFileWritePage(TDB_MPFILE *mpf, pgno_t pgno, const void *p) {
// TODO: handle error // TODO: handle error
return 0; return 0;
}
static void tdbMPoolClockEvictPage(TDB_MPOOL *mp, pg_t **pagepp) {
pg_t * pagep;
frame_id_t och;
*pagepp = NULL;
och = mp->clockHand;
do {
pagep = mp->pages + mp->clockHand;
mp->clockHand = (mp->clockHand + 1) % mp->npages;
if (pagep->pinRef == 0) {
if (pagep->rbit == 1) {
pagep->rbit = 0;
} else {
break;
}
}
if (mp->clockHand == och) {
return;
}
} while (1);
*pagepp = pagep;
} }
\ No newline at end of file
...@@ -45,11 +45,12 @@ typedef struct { ...@@ -45,11 +45,12 @@ typedef struct {
TD_DLIST(TDB_MPFILE); TD_DLIST(TDB_MPFILE);
} mpf_bucket_t; } mpf_bucket_t;
struct TDB_MPOOL { struct TDB_MPOOL {
int64_t cachesize; int64_t cachesize;
pgsize_t pgsize; pgsize_t pgsize;
int32_t npages; int32_t npages;
pg_t * pages; pg_t * pages;
pg_list_t freeList; pg_list_t freeList;
frame_id_t clockHand;
struct { struct {
int32_t nbucket; int32_t nbucket;
pg_list_t *hashtab; pg_list_t *hashtab;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册