more tdb
This commit is contained in:
parent
e9984c992d
commit
daa29bca42
|
@ -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) {
|
||||||
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) {
|
||||||
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -347,3 +350,30 @@ static int tdbMPoolFileWritePage(TDB_MPFILE *mpf, pgno_t pgno, const void *p) {
|
||||||
|
|
||||||
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;
|
||||||
|
}
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue