mdbx: refine mdbx_page_copy().

Change-Id: I73ad272b468430e7bf79462750887e75ef71bd60
This commit is contained in:
Leonid Yuriev 2019-10-03 19:40:05 +03:00
parent bf818ddf1e
commit daddd53793

View File

@ -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.
* *