mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
c2872bafde
(lockmanager still fails unit tests) BitKeeper/deleted/.del-Makefile.am~4375ae3d4de2bdf0: Delete: unittest/maria/Makefile.am configure.in: silence up configure warnings, don't generate unittest/maria/Makefile include/atomic/nolock.h: s/LOCK/LOCK_prefix/ include/atomic/x86-gcc.h: s/LOCK/LOCK_prefix/ include/atomic/x86-msvc.h: s/LOCK/LOCK_prefix/ include/lf.h: pin asserts, renames include/my_atomic.h: move cleanup include/my_bit.h: s/uint/uint32/ mysys/lf_dynarray.c: style fixes, split for() in two, remove if()s mysys/lf_hash.c: renames, minor fixes mysys/my_atomic.c: run-time assert -> compile-time assert storage/maria/Makefile.am: lockman here storage/maria/unittest/Makefile.am: new unit tests storage/maria/unittest/trnman-t.c: lots of changes storage/maria/lockman.c: many changes: second meaning of "blocker" portability: s/gettimeofday/my_getsystime/ move mutex/cond out of LOCK_OWNER - it creates a race condition that will be fixed in a separate changeset increment lm->count for every element, not only for distinct ones - because we cannot decrease it for distinct elements only :( storage/maria/lockman.h: move mutex/cond out of LOCK_OWNER storage/maria/trnman.c: move mutex/cond out of LOCK_OWNER atomic-ops to access short_trid_to_trn[] storage/maria/trnman.h: move mutex/cond out of LOCK_OWNER storage/maria/unittest/lockman-t.c: unit stress test
107 lines
2.8 KiB
C
107 lines
2.8 KiB
C
/*
|
|
Some useful bit functions
|
|
*/
|
|
|
|
#ifdef HAVE_INLINE
|
|
|
|
extern const char _my_bits_nbits[256];
|
|
extern const uchar _my_bits_reverse_table[256];
|
|
|
|
/*
|
|
Find smallest X in 2^X >= value
|
|
This can be used to divide a number with value by doing a shift instead
|
|
*/
|
|
|
|
STATIC_INLINE uint my_bit_log2(ulong value)
|
|
{
|
|
uint bit;
|
|
for (bit=0 ; value > 1 ; value>>=1, bit++) ;
|
|
return bit;
|
|
}
|
|
|
|
STATIC_INLINE uint my_count_bits(ulonglong v)
|
|
{
|
|
#if SIZEOF_LONG_LONG > 4
|
|
/* The following code is a bit faster on 16 bit machines than if we would
|
|
only shift v */
|
|
ulong v2=(ulong) (v >> 32);
|
|
return (uint) (uchar) (_my_bits_nbits[(uchar) v] +
|
|
_my_bits_nbits[(uchar) (v >> 8)] +
|
|
_my_bits_nbits[(uchar) (v >> 16)] +
|
|
_my_bits_nbits[(uchar) (v >> 24)] +
|
|
_my_bits_nbits[(uchar) (v2)] +
|
|
_my_bits_nbits[(uchar) (v2 >> 8)] +
|
|
_my_bits_nbits[(uchar) (v2 >> 16)] +
|
|
_my_bits_nbits[(uchar) (v2 >> 24)]);
|
|
#else
|
|
return (uint) (uchar) (_my_bits_nbits[(uchar) v] +
|
|
_my_bits_nbits[(uchar) (v >> 8)] +
|
|
_my_bits_nbits[(uchar) (v >> 16)] +
|
|
_my_bits_nbits[(uchar) (v >> 24)]);
|
|
#endif
|
|
}
|
|
|
|
STATIC_INLINE uint my_count_bits_ushort(ushort v)
|
|
{
|
|
return _my_bits_nbits[v];
|
|
}
|
|
|
|
|
|
/*
|
|
Next highest power of two
|
|
|
|
SYNOPSIS
|
|
my_round_up_to_next_power()
|
|
v Value to check
|
|
|
|
RETURN
|
|
Next or equal power of 2
|
|
Note: 0 will return 0
|
|
|
|
NOTES
|
|
Algorithm by Sean Anderson, according to:
|
|
http://graphics.stanford.edu/~seander/bithacks.html
|
|
(Orignal code public domain)
|
|
|
|
Comments shows how this works with 01100000000000000000000000001011
|
|
*/
|
|
|
|
STATIC_INLINE uint32 my_round_up_to_next_power(uint32 v)
|
|
{
|
|
v--; /* 01100000000000000000000000001010 */
|
|
v|= v >> 1; /* 01110000000000000000000000001111 */
|
|
v|= v >> 2; /* 01111100000000000000000000001111 */
|
|
v|= v >> 4; /* 01111111110000000000000000001111 */
|
|
v|= v >> 8; /* 01111111111111111100000000001111 */
|
|
v|= v >> 16; /* 01111111111111111111111111111111 */
|
|
return v+1; /* 10000000000000000000000000000000 */
|
|
}
|
|
|
|
STATIC_INLINE uint32 my_clear_highest_bit(uint32 v)
|
|
{
|
|
uint32 w=v >> 1;
|
|
w|= w >> 1;
|
|
w|= w >> 2;
|
|
w|= w >> 4;
|
|
w|= w >> 8;
|
|
w|= w >> 16;
|
|
return v & w;
|
|
}
|
|
|
|
STATIC_INLINE uint32 my_reverse_bits(uint32 key)
|
|
{
|
|
return
|
|
(_my_bits_reverse_table[ key & 255] << 24) |
|
|
(_my_bits_reverse_table[(key>> 8) & 255] << 16) |
|
|
(_my_bits_reverse_table[(key>>16) & 255] << 8) |
|
|
_my_bits_reverse_table[(key>>24) ];
|
|
}
|
|
|
|
#else
|
|
extern uint my_bit_log2(ulong value);
|
|
extern uint32 my_round_up_to_next_power(uint32 v);
|
|
uint32 my_clear_highest_bit(uint32 v);
|
|
uint32 my_reverse_bits(uint32 key);
|
|
extern uint my_count_bits(ulonglong v);
|
|
extern uint my_count_bits_ushort(ushort v);
|
|
#endif
|