This commit is contained in:
Hongze Cheng 2022-03-14 05:42:40 +00:00
parent 77af8e6b5d
commit 40c2df1e34
1 changed files with 22 additions and 6 deletions

View File

@ -17,14 +17,30 @@
typedef struct __attribute__((__packed__)) { typedef struct __attribute__((__packed__)) {
u16 size; u16 size;
u16 nOffset; u16 nxOffset;
} SFreeCell; } SFreeCell;
typedef struct __attribute__((__packed__)) { typedef struct __attribute__((__packed__)) {
u8 size[3]; u8 size[3];
u8 nOffset[3]; u8 nxOffset[3];
} SFreeCellL; } SFreeCellL;
/* For small page */
#define TDB_SPAGE_FREE_CELL_SIZE(PCELL) (((SFreeCell *)(PCELL))[0].size)
#define TDB_SPAGE_FREE_CELL_NXOFFSET(PCELL) (((SFreeCell *)(PCELL))[0].nxOffset)
#define TDB_SPAGE_FREE_CELL_SIZE_SET(PCELL, SIZE) (((SFreeCell *)(PCELL))[0].size = (SIZE))
#define TDB_SPAGE_FREE_CELL_NXOFFSET_SET(PCELL, OFFSET) (((SFreeCell *)(PCELL))[0].nxOffset = (OFFSET))
/* For large page */
#define TDB_LPAGE_FREE_CELL_SIZE(PCELL) TDB_GET_U24(((SFreeCellL *)(PCELL))[0].size)
#define TDB_LPAGE_FREE_CELL_NXOFFSET(PCELL) TDB_GET_U24(((SFreeCellL *)(PCELL))[0].nxOffset)
#define TDB_LPAGE_FREE_CELL_SIZE_SET(PCELL, SIZE) TDB_PUT_U24(((SFreeCellL *)(PCELL))[0].size, SIZE)
#define TDB_LPAGE_FREE_CELL_NXOFFSET_SET(PCELL, OFFSET) TDB_PUT_U24(((SFreeCellL *)(PCELL))[0].nxOffset, OFFSET)
/* For page */
static int tdbPageAllocate(SPage *pPage, int size, SCell **ppCell); static int tdbPageAllocate(SPage *pPage, int size, SCell **ppCell);
static int tdbPageDefragment(SPage *pPage); static int tdbPageDefragment(SPage *pPage);
@ -128,7 +144,7 @@ static int tdbPageAllocate(SPage *pPage, int size, SCell **ppCell) {
if (pFreeCell->size >= size) { if (pFreeCell->size >= size) {
if (pFreeCell->size - size >= 4 /*TODO*/) { if (pFreeCell->size - size >= 4 /*TODO*/) {
((SFreeCell *)(pCell + size))[0].size = pFreeCell->size - size; ((SFreeCell *)(pCell + size))[0].size = pFreeCell->size - size;
((SFreeCell *)(pCell + size))[0].nOffset = pFreeCell->nOffset; ((SFreeCell *)(pCell + size))[0].nxOffset = pFreeCell->nxOffset;
// *(u16 *)pOffset = pCell + size - pPage->pData; // *(u16 *)pOffset = pCell + size - pPage->pData;
} else { } else {
TDB_PAGE_NFREE_SET(pPage, TDB_PAGE_NFREE(pPage) + pFreeCell->size - size); TDB_PAGE_NFREE_SET(pPage, TDB_PAGE_NFREE(pPage) + pFreeCell->size - size);
@ -137,9 +153,9 @@ static int tdbPageAllocate(SPage *pPage, int size, SCell **ppCell) {
break; break;
} }
if (pFreeCell->nOffset) { if (pFreeCell->nxOffset) {
pCell = pPage->pData + pFreeCell->nOffset; pCell = pPage->pData + pFreeCell->nxOffset;
// TODO: pOffset = &(pFreeCell->nOffset); // TODO: pOffset = &(pFreeCell->nxOffset);
} else { } else {
pCell = NULL; pCell = NULL;
break; break;