Commit c6d36c3e authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-34297 get_rnd_value() of ib_counter_t is unnecessarily complex

The shared counter template ib_counter_t uses the function
my_timer_cycles() as a source of pseudo-random numbers to pick a shard.
On some platforms, my_timer_cycles() could return the constant value 0.

get_rnd_value(): Remove.

my_pseudo_random(): Implement as an alias of my_timer_cycles() or
a wrapper for pthread_self().

Reviewed by: Vladislav Vaintroub
parent ecf4a261
...@@ -177,10 +177,23 @@ static inline ulonglong my_timer_cycles(void) ...@@ -177,10 +177,23 @@ static inline ulonglong my_timer_cycles(void)
/* gethrtime may appear as either cycle or nanosecond counter */ /* gethrtime may appear as either cycle or nanosecond counter */
return (ulonglong) gethrtime(); return (ulonglong) gethrtime();
#else #else
# define MY_TIMER_CYCLES_IS_ZERO
return 0; return 0;
#endif #endif
} }
#ifdef MY_TIMER_CYCLES_IS_ZERO
static inline size_t my_pseudo_random(void)
{
/* In some platforms, pthread_self() might return a structure
that cannot be converted to a number like this. Possible alternatives
could include gettid() or sched_getcpu(). */
return ((size_t) pthread_self()) / 16;
}
#else
# define my_pseudo_random my_timer_cycles
#endif
/** /**
A nanosecond timer. A nanosecond timer.
@return the current timer value, in nanoseconds. @return the current timer value, in nanoseconds.
......
...@@ -44,7 +44,7 @@ sync_array_get() ...@@ -44,7 +44,7 @@ sync_array_get()
return(sync_wait_array[0]); return(sync_wait_array[0]);
} }
return(sync_wait_array[get_rnd_value() % sync_array_size]); return(sync_wait_array[my_pseudo_random() % sync_array_size]);
} }
/******************************************************************//** /******************************************************************//**
......
...@@ -41,30 +41,6 @@ Created 2012/04/12 by Sunny Bains ...@@ -41,30 +41,6 @@ Created 2012/04/12 by Sunny Bains
/** Default number of slots to use in ib_counter_t */ /** Default number of slots to use in ib_counter_t */
#define IB_N_SLOTS 64 #define IB_N_SLOTS 64
/** Use the result of my_timer_cycles(), which mainly uses RDTSC for cycles
as a random value. See the comments for my_timer_cycles() */
/** @return result from RDTSC or similar functions. */
static inline size_t
get_rnd_value()
{
size_t c = static_cast<size_t>(my_timer_cycles());
if (c != 0) {
return c;
}
/* We may go here if my_timer_cycles() returns 0,
so we have to have the plan B for the counter. */
#if !defined(_WIN32)
return (size_t)os_thread_get_curr_id();
#else
LARGE_INTEGER cnt;
QueryPerformanceCounter(&cnt);
return static_cast<size_t>(cnt.QuadPart);
#endif /* !_WIN32 */
}
/** Class for using fuzzy counters. The counter is multi-instance relaxed atomic /** Class for using fuzzy counters. The counter is multi-instance relaxed atomic
so the results are not guaranteed to be 100% accurate but close so the results are not guaranteed to be 100% accurate but close
enough. Creates an array of counters and separates each element by the enough. Creates an array of counters and separates each element by the
...@@ -80,7 +56,7 @@ struct ib_counter_t { ...@@ -80,7 +56,7 @@ struct ib_counter_t {
/** Add to the counter. /** Add to the counter.
@param[in] n amount to be added */ @param[in] n amount to be added */
void add(Type n) { add(get_rnd_value(), n); } void add(Type n) { add(my_pseudo_random(), n); }
/** Add to the counter. /** Add to the counter.
@param[in] index a reasonably thread-unique identifier @param[in] index a reasonably thread-unique identifier
......
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