mirror of
https://github.com/isar/libmdbx.git
synced 2025-03-14 08:28:13 +08:00
mdbx: refine mdbx_page_copy().
Change-Id: I73ad272b468430e7bf79462750887e75ef71bd60
This commit is contained in:
parent
bf818ddf1e
commit
daddd53793
@ -3262,20 +3262,21 @@ __hot static void mdbx_page_copy(MDBX_page *dst, MDBX_page *src,
|
|||||||
unsigned psize) {
|
unsigned psize) {
|
||||||
STATIC_ASSERT(UINT16_MAX > MAX_PAGESIZE - PAGEHDRSZ);
|
STATIC_ASSERT(UINT16_MAX > MAX_PAGESIZE - PAGEHDRSZ);
|
||||||
STATIC_ASSERT(MIN_PAGESIZE > PAGEHDRSZ + NODESIZE * 42);
|
STATIC_ASSERT(MIN_PAGESIZE > PAGEHDRSZ + NODESIZE * 42);
|
||||||
enum { Align = sizeof(pgno_t) };
|
if (!IS_LEAF2(src)) {
|
||||||
indx_t upper = src->mp_upper, lower = src->mp_lower, unused = upper - lower;
|
size_t upper = src->mp_upper, lower = src->mp_lower, unused = upper - lower;
|
||||||
|
|
||||||
/* If page isn't full, just copy the used portion. Adjust
|
/* If page isn't full, just copy the used portion. Adjust
|
||||||
* alignment so memcpy may copy words instead of bytes. */
|
* alignment so memcpy may copy words instead of bytes. */
|
||||||
if ((unused &= -Align) && !IS_LEAF2(src)) {
|
if (unused > sizeof(void *) * 42) {
|
||||||
upper = (upper + PAGEHDRSZ) & -Align;
|
lower = mdbx_roundup2(lower + PAGEHDRSZ, sizeof(void *));
|
||||||
memcpy(dst, src, (lower + PAGEHDRSZ + (Align - 1)) & -Align);
|
upper = (upper + PAGEHDRSZ) & ~(sizeof(void *) - 1);
|
||||||
memcpy((pgno_t *)((char *)dst + upper), (pgno_t *)((char *)src + upper),
|
memcpy(dst, src, lower);
|
||||||
psize - upper);
|
memcpy((char *)dst + upper, (char *)src + upper, psize - upper);
|
||||||
} else {
|
return;
|
||||||
memcpy(dst, src, psize - unused);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
memcpy(dst, src, psize);
|
||||||
|
}
|
||||||
|
|
||||||
/* Pull a page off the txn's spill list, if present.
|
/* Pull a page off the txn's spill list, if present.
|
||||||
*
|
*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user