Commit d4f5d8a8 authored by marko's avatar marko

branches/zip: ut_is_2pow(), ut_2pow_round(), ut_2pow_remainder(): Define

as type-independent macros instead of functions.  Because ut_2pow_round()
and ut_2pow_remainder() no longer assert ut_is_2pow(m), add the assertions
to callers when needed.  Also add parentheses to assist the compiler in
common subexpression elimination.
parent 0f599ce0
...@@ -637,6 +637,8 @@ xdes_calc_descriptor_page( ...@@ -637,6 +637,8 @@ xdes_calc_descriptor_page(
+ (PAGE_ZIP_MIN_SIZE / FSP_EXTENT_SIZE) * XDES_SIZE + (PAGE_ZIP_MIN_SIZE / FSP_EXTENT_SIZE) * XDES_SIZE
# error # error
#endif #endif
ut_ad(ut_is_2pow(zip_size));
if (!zip_size) { if (!zip_size) {
return(ut_2pow_round(offset, UNIV_PAGE_SIZE)); return(ut_2pow_round(offset, UNIV_PAGE_SIZE));
} else { } else {
...@@ -657,6 +659,8 @@ xdes_calc_descriptor_index( ...@@ -657,6 +659,8 @@ xdes_calc_descriptor_index(
0 for uncompressed pages */ 0 for uncompressed pages */
ulint offset) /* in: page offset */ ulint offset) /* in: page offset */
{ {
ut_ad(ut_is_2pow(zip_size));
if (!zip_size) { if (!zip_size) {
return(ut_2pow_remainder(offset, UNIV_PAGE_SIZE) return(ut_2pow_remainder(offset, UNIV_PAGE_SIZE)
/ FSP_EXTENT_SIZE); / FSP_EXTENT_SIZE);
......
...@@ -136,7 +136,8 @@ hash_create_mutexes_func( ...@@ -136,7 +136,8 @@ hash_create_mutexes_func(
{ {
ulint i; ulint i;
ut_a(n_mutexes > 0 && ut_is_2pow(n_mutexes)); ut_a(n_mutexes > 0);
ut_a(ut_is_2pow(n_mutexes));
table->mutexes = mem_alloc(n_mutexes * sizeof(mutex_t)); table->mutexes = mem_alloc(n_mutexes * sizeof(mutex_t));
......
...@@ -70,6 +70,7 @@ hash_get_mutex_no( ...@@ -70,6 +70,7 @@ hash_get_mutex_no(
hash_table_t* table, /* in: hash table */ hash_table_t* table, /* in: hash table */
ulint fold) /* in: fold */ ulint fold) /* in: fold */
{ {
ut_ad(ut_is_2pow(table->n_mutexes));
return(ut_2pow_remainder(fold, table->n_mutexes)); return(ut_2pow_remainder(fold, table->n_mutexes));
} }
......
...@@ -97,30 +97,15 @@ ut_pair_cmp( ...@@ -97,30 +97,15 @@ ut_pair_cmp(
ulint b1, /* in: more significant part of second pair */ ulint b1, /* in: more significant part of second pair */
ulint b2); /* in: less significant part of second pair */ ulint b2); /* in: less significant part of second pair */
/***************************************************************** /*****************************************************************
Determines if a number is zero or a power of two. Determines if a number is zero or a power of two. */
This function is used in assertions or assertion-like tests. */ #define ut_is_2pow(n) UNIV_LIKELY(!((n) & ((n) - 1)))
UNIV_INLINE
ibool
ut_is_2pow(
/*=======*/ /* out: TRUE if zero or a power of 2 */
ulint n); /* in: number to be tested */
/***************************************************************** /*****************************************************************
Calculates fast the remainder when divided by a power of two. */ Calculates fast the remainder of n/m when m is a power of two. */
UNIV_INLINE #define ut_2pow_remainder(n, m) ((n) & ((m) - 1))
ulint
ut_2pow_remainder(
/*==============*/ /* out: remainder */
ulint n, /* in: number to be divided */
ulint m); /* in: divisor; power of 2 */
/***************************************************************** /*****************************************************************
Calculates fast value rounded to a multiple of a power of 2. */ Calculates n rounded down to the nearest multiple of m
UNIV_INLINE when m is a power of two. */
ulint #define ut_2pow_round(n, m) ((n) & ~((m) - 1))
ut_2pow_round(
/*==========*/ /* out: value of n rounded down to nearest
multiple of m */
ulint n, /* in: number to be rounded */
ulint m); /* in: divisor; power of 2 */
/***************************************************************** /*****************************************************************
Calculates fast the 2-logarithm of a number, rounded upward to an Calculates fast the 2-logarithm of a number, rounded upward to an
integer. */ integer. */
......
...@@ -101,47 +101,6 @@ ut_pair_cmp( ...@@ -101,47 +101,6 @@ ut_pair_cmp(
} }
} }
/*****************************************************************
Determines if a number is zero or a power of two.
This function is used in assertions or assertion-like tests. */
UNIV_INLINE
ibool
ut_is_2pow(
/*=======*/ /* out: TRUE if zero or a power of 2 */
ulint n) /* in: number to be tested */
{
return(UNIV_LIKELY(!(n & (n - 1))));
}
/*****************************************************************
Calculates fast the remainder when divided by a power of two. */
UNIV_INLINE
ulint
ut_2pow_remainder(
/*==============*/ /* out: remainder */
ulint n, /* in: number to be divided */
ulint m) /* in: divisor; power of 2 */
{
ut_ad(ut_is_2pow(m));
return(n & (m - 1));
}
/*****************************************************************
Calculates fast a value rounded to a multiple of a power of 2. */
UNIV_INLINE
ulint
ut_2pow_round(
/*==========*/ /* out: value of n rounded down to nearest
multiple of m */
ulint n, /* in: number to be rounded */
ulint m) /* in: divisor; power of 2 */
{
ut_ad(ut_is_2pow(m));
return(n & ~(m - 1));
}
/***************************************************************** /*****************************************************************
Calculates fast the 2-logarithm of a number, rounded upward to an Calculates fast the 2-logarithm of a number, rounded upward to an
integer. */ integer. */
......
...@@ -86,7 +86,9 @@ os_mem_alloc_large( ...@@ -86,7 +86,9 @@ os_mem_alloc_large(
} }
/* Align block size to os_large_page_size */ /* Align block size to os_large_page_size */
size = ut_2pow_round(*n + os_large_page_size - 1, os_large_page_size); ut_ad(ut_is_2pow(os_large_page_size));
size = ut_2pow_round(*n + (os_large_page_size - 1),
os_large_page_size);
shmid = shmget(IPC_PRIVATE, (size_t)size, SHM_HUGETLB | SHM_R | SHM_W); shmid = shmget(IPC_PRIVATE, (size_t)size, SHM_HUGETLB | SHM_R | SHM_W);
if (shmid < 0) { if (shmid < 0) {
...@@ -126,7 +128,8 @@ skip: ...@@ -126,7 +128,8 @@ skip:
GetSystemInfo(&system_info); GetSystemInfo(&system_info);
/* Align block size to system page size */ /* Align block size to system page size */
size = *n = ut_2pow_round(*n + system_info.dwPageSize - 1, ut_ad(ut_is_2pow(system_info.dwPageSize));
size = *n = ut_2pow_round(*n + (system_info.dwPageSize - 1),
system_info.dwPageSize); system_info.dwPageSize);
ptr = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, ptr = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE,
PAGE_READWRITE); PAGE_READWRITE);
...@@ -147,7 +150,8 @@ skip: ...@@ -147,7 +150,8 @@ skip:
size = UNIV_PAGE_SIZE; size = UNIV_PAGE_SIZE;
# endif # endif
/* Align block size to system page size */ /* Align block size to system page size */
size = *n = ut_2pow_round(*n + size - 1, size); ut_ad(ut_is_2pow(size));
size = *n = ut_2pow_round(*n + (size - 1), size);
ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, ptr = mmap(NULL, size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | OS_MAP_ANON, -1, 0); MAP_PRIVATE | OS_MAP_ANON, -1, 0);
if (UNIV_UNLIKELY(ptr == (void*) -1)) { if (UNIV_UNLIKELY(ptr == (void*) -1)) {
......
...@@ -1474,7 +1474,8 @@ row_merge_sort( ...@@ -1474,7 +1474,8 @@ row_merge_sort(
ulint half; ulint half;
ulint error; ulint error;
half = ut_2pow_round((file->offset + blksz - 1) / 2, blksz); ut_ad(ut_is_2pow(blksz));
half = ut_2pow_round((file->offset + (blksz - 1)) / 2, blksz);
error = row_merge(index, file, half, block, tmpfd, table); error = row_merge(index, file, half, block, tmpfd, table);
if (error != DB_SUCCESS) { if (error != DB_SUCCESS) {
......
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