mirror of
https://github.com/isar/libmdbx.git
synced 2025-10-25 01:08:56 +08:00
mdbx: refine/speedup PAGETYPE().
This commit is contained in:
@@ -515,19 +515,18 @@ typedef struct MDBX_page {
|
||||
mp_txnid; /* txnid which created this page, maybe zero in legacy DB */
|
||||
struct MDBX_page *mp_next; /* for in-memory list of freed pages */
|
||||
};
|
||||
uint16_t mp_leaf2_ksize; /* key size if this is a LEAF2 page */
|
||||
#define P_BRANCH 0x01 /* branch page */
|
||||
#define P_LEAF 0x02 /* leaf page */
|
||||
#define P_OVERFLOW 0x04 /* overflow page */
|
||||
#define P_META 0x08 /* meta page */
|
||||
#define P_BAD 0x10 /* explicit flag for invalid/bad page */
|
||||
#define P_LEAF2 0x20 /* for MDBX_DUPFIXED records */
|
||||
#define P_SUBP 0x40 /* for MDBX_DUPSORT sub-pages */
|
||||
#define PAGETYPE_EXTRA(p) ((char)(p)->mp_flags)
|
||||
#define PAGETYPE(p) (PAGETYPE_EXTRA(p) & ~P_SUBP)
|
||||
#define P_SPILLED 0x2000 /* spilled in parent txn */
|
||||
#define P_LOOSE 0x4000 /* page was dirtied then freed, can be reused */
|
||||
#define P_FROZEN 0x8000 /* used for retire page with known status */
|
||||
uint16_t mp_leaf2_ksize; /* key size if this is a LEAF2 page */
|
||||
#define P_BRANCH 0x01 /* branch page */
|
||||
#define P_LEAF 0x02 /* leaf page */
|
||||
#define P_OVERFLOW 0x04 /* overflow page */
|
||||
#define P_META 0x08 /* meta page */
|
||||
#define P_LEGACY_DIRTY 0x10 /* legacy P_DIRTY flag prior to v0.10 958fd5b9 */
|
||||
#define P_BAD P_LEGACY_DIRTY /* explicit flag for invalid/bad page */
|
||||
#define P_LEAF2 0x20 /* for MDBX_DUPFIXED records */
|
||||
#define P_SUBP 0x40 /* for MDBX_DUPSORT sub-pages */
|
||||
#define P_SPILLED 0x2000 /* spilled in parent txn */
|
||||
#define P_LOOSE 0x4000 /* page was dirtied then freed, can be reused */
|
||||
#define P_FROZEN 0x8000 /* used for retire page with known status */
|
||||
#define P_ILL_BITS \
|
||||
((uint16_t) ~(P_BRANCH | P_LEAF | P_LEAF2 | P_OVERFLOW | P_SPILLED))
|
||||
uint16_t mp_flags;
|
||||
@@ -546,6 +545,14 @@ typedef struct MDBX_page {
|
||||
#endif /* C99 */
|
||||
} MDBX_page;
|
||||
|
||||
#define PAGETYPE_WHOLE(p) ((char)(p)->mp_flags)
|
||||
|
||||
/* Drop legacy P_DIRTY flag for sub-pages for compatilibity */
|
||||
#define PAGETYPE_COMPAT(p) \
|
||||
(unlikely(PAGETYPE_WHOLE(p) & P_SUBP) \
|
||||
? PAGETYPE_WHOLE(p) & ~(P_SUBP | P_LEGACY_DIRTY) \
|
||||
: PAGETYPE_WHOLE(p))
|
||||
|
||||
/* Size of the page header, excluding dynamic data at the end */
|
||||
#define PAGEHDRSZ ((unsigned)offsetof(MDBX_page, mp_ptrs))
|
||||
|
||||
@@ -1064,7 +1071,7 @@ struct MDBX_cursor {
|
||||
};
|
||||
|
||||
#define CHECK_LEAF_TYPE(mc, mp) \
|
||||
(((PAGETYPE_EXTRA(mp) ^ (mc)->mc_checking) & \
|
||||
(((PAGETYPE_WHOLE(mp) ^ (mc)->mc_checking) & \
|
||||
(CC_BRANCH | CC_LEAF | CC_OVERFLOW | CC_LEAF2)) == 0)
|
||||
|
||||
/* Context for sorted-dup records.
|
||||
|
||||
Reference in New Issue
Block a user