more TDB
This commit is contained in:
parent
c4e86a7339
commit
ec3f723d33
|
@ -291,10 +291,11 @@ static int tdbPagerAllocPage(SPager *pPager, SPgno *ppgno) {
|
|||
|
||||
static int tdbPagerInitPage(SPager *pPager, SPage *pPage, int (*initPage)(SPage *, void *), void *arg) {
|
||||
int ret;
|
||||
int lcode;
|
||||
int nLoops;
|
||||
|
||||
ret = TDB_TRY_LOCK_PAGE(pPage);
|
||||
if (ret == 0) {
|
||||
lcode = TDB_TRY_LOCK_PAGE(pPage);
|
||||
if (lcode == P_LOCK_SUCC) {
|
||||
if (TDB_PAGE_INITIALIZED(pPage)) {
|
||||
TDB_UNLOCK_PAGE(pPage);
|
||||
return 0;
|
||||
|
@ -309,10 +310,7 @@ static int tdbPagerInitPage(SPager *pPager, SPage *pPage, int (*initPage)(SPage
|
|||
pPage->pPager = pPager;
|
||||
|
||||
TDB_UNLOCK_PAGE(pPage);
|
||||
} else {
|
||||
// TODO: Here, we still use the pthread API here
|
||||
if (errno != EBUSY) return -1;
|
||||
|
||||
} else if (lcode == P_LOCK_BUSY) {
|
||||
nLoops = 0;
|
||||
for (;;) {
|
||||
if (TDB_PAGE_INITIALIZED(pPage)) break;
|
||||
|
@ -322,6 +320,8 @@ static int tdbPagerInitPage(SPager *pPager, SPage *pPage, int (*initPage)(SPage
|
|||
nLoops = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -55,11 +55,26 @@ struct SPage {
|
|||
};
|
||||
|
||||
// For page lock
|
||||
#define P_LOCK_SUCC 0
|
||||
#define P_LOCK_BUSY 1
|
||||
#define P_LOCK_FAIL -1
|
||||
|
||||
#define TDB_INIT_PAGE_LOCK(pPage) pthread_spin_init(&((pPage)->lock), 0)
|
||||
#define TDB_DESTROY_PAGE_LOCK(pPage) pthread_spin_destroy(&((pPage)->lock))
|
||||
#define TDB_LOCK_PAGE(pPage) pthread_spin_lock(&((pPage)->lock))
|
||||
#define TDB_TRY_LOCK_PAGE(pPage) pthread_spin_trylock(&((pPage)->lock))
|
||||
#define TDB_UNLOCK_PAGE(pPage) pthread_spin_unlock(&((pPage)->lock))
|
||||
#define TDB_TRY_LOCK_PAGE(pPage) \
|
||||
({ \
|
||||
int ret; \
|
||||
if (pthread_spin_trylock(&((pPage)->lock)) == 0) { \
|
||||
ret = P_LOCK_SUCC; \
|
||||
} else if (errno == EBUSY) { \
|
||||
ret = P_LOCK_BUSY; \
|
||||
} else { \
|
||||
ret = P_LOCK_FAIL; \
|
||||
} \
|
||||
ret; \
|
||||
})
|
||||
|
||||
// For page ref (TODO: Need atomic operation)
|
||||
#define TDB_INIT_PAGE_REF(pPage) ((pPage)->nRef = 0)
|
||||
|
|
Loading…
Reference in New Issue