Commit 51a4260f authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-21133: Introduce memmove_aligned()

Both variants of the InnoDB page directory are aligned to the entry size
(16 bits). Inform the compiler about it.
parent 0f71e9e6
...@@ -210,6 +210,13 @@ inline void *memcpy_aligned(void *dest, const void *src, size_t n) ...@@ -210,6 +210,13 @@ inline void *memcpy_aligned(void *dest, const void *src, size_t n)
MY_ASSUME_ALIGNED(src, Alignment), n); MY_ASSUME_ALIGNED(src, Alignment), n);
} }
template <size_t Alignment> template <size_t Alignment>
inline void *memmove_aligned(void *dest, const void *src, size_t n)
{
static_assert(Alignment && !(Alignment & (Alignment - 1)), "power of 2");
return memmove(MY_ASSUME_ALIGNED(dest, Alignment),
MY_ASSUME_ALIGNED(src, Alignment), n);
}
template <size_t Alignment>
inline int memcmp_aligned(const void *s1, const void *s2, size_t n) inline int memcmp_aligned(const void *s1, const void *s2, size_t n)
{ {
static_assert(Alignment && !(Alignment & (Alignment - 1)), "power of 2"); static_assert(Alignment && !(Alignment & (Alignment - 1)), "power of 2");
......
...@@ -1273,7 +1273,8 @@ static void page_dir_split_slot(page_t* page, page_zip_des_t* page_zip, ...@@ -1273,7 +1273,8 @@ static void page_dir_split_slot(page_t* page, page_zip_des_t* page_zip,
const ulint n_slots = page_dir_get_n_slots(page); const ulint n_slots = page_dir_get_n_slots(page);
page_dir_set_n_slots(page, page_zip, n_slots + 1); page_dir_set_n_slots(page, page_zip, n_slots + 1);
page_dir_slot_t* last_slot = page_dir_get_nth_slot(page, n_slots); page_dir_slot_t* last_slot = page_dir_get_nth_slot(page, n_slots);
memmove(last_slot, last_slot + PAGE_DIR_SLOT_SIZE, slot - last_slot); memmove_aligned<2>(last_slot, last_slot + PAGE_DIR_SLOT_SIZE,
slot - last_slot);
/* 3. We store the appropriate values to the new slot. */ /* 3. We store the appropriate values to the new slot. */
...@@ -1327,7 +1328,7 @@ static void page_dir_balance_slot(page_t* page, page_zip_des_t* page_zip, ...@@ -1327,7 +1328,7 @@ static void page_dir_balance_slot(page_t* page, page_zip_des_t* page_zip,
/* Shift the slots */ /* Shift the slots */
page_dir_slot_t* last_slot = page_dir_get_nth_slot( page_dir_slot_t* last_slot = page_dir_get_nth_slot(
page, n_slots - 1); page, n_slots - 1);
memmove(last_slot + PAGE_DIR_SLOT_SIZE, last_slot, memmove_aligned<2>(last_slot + PAGE_DIR_SLOT_SIZE, last_slot,
slot - last_slot); slot - last_slot);
mach_write_to_2(last_slot, 0); mach_write_to_2(last_slot, 0);
page_dir_set_n_slots(page, page_zip, n_slots - 1); page_dir_set_n_slots(page, page_zip, n_slots - 1);
......
...@@ -4430,7 +4430,7 @@ page_zip_dir_insert( ...@@ -4430,7 +4430,7 @@ page_zip_dir_insert(
} }
/* Shift the dense directory to allocate place for rec. */ /* Shift the dense directory to allocate place for rec. */
memmove(slot_free - PAGE_ZIP_DIR_SLOT_SIZE, slot_free, memmove_aligned<2>(slot_free - PAGE_ZIP_DIR_SLOT_SIZE, slot_free,
ulint(slot_rec - slot_free)); ulint(slot_rec - slot_free));
/* Write the entry for the inserted record. /* Write the entry for the inserted record.
...@@ -4489,9 +4489,8 @@ page_zip_dir_delete( ...@@ -4489,9 +4489,8 @@ page_zip_dir_delete(
} }
if (UNIV_LIKELY(slot_rec > slot_free)) { if (UNIV_LIKELY(slot_rec > slot_free)) {
memmove(slot_free + PAGE_ZIP_DIR_SLOT_SIZE, memmove_aligned<2>(slot_free + PAGE_ZIP_DIR_SLOT_SIZE,
slot_free, slot_free, ulint(slot_rec - slot_free));
ulint(slot_rec - slot_free));
} }
/* Write the entry for the deleted record. /* Write the entry for the deleted record.
...@@ -4585,7 +4584,8 @@ page_zip_dir_add_slot( ...@@ -4585,7 +4584,8 @@ page_zip_dir_add_slot(
/* Move the uncompressed area backwards to make space /* Move the uncompressed area backwards to make space
for one directory slot. */ for one directory slot. */
memmove(stored - PAGE_ZIP_DIR_SLOT_SIZE, stored, ulint(dir - stored)); memmove_aligned<2>(stored - PAGE_ZIP_DIR_SLOT_SIZE, stored,
ulint(dir - stored));
} }
/***********************************************************//** /***********************************************************//**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment