38 , entry_count_in_use { 0 }
39 ,
style (chunking_style::ONE_CHUNK)
53 lf_bitmap_init (
this, style_arg, entries_count_arg, usage_ratio_arg);
84 unsigned int mask, chunk;
95 if (usage_threshold < 0.0f || usage_threshold > 1.0f)
103 bitmap->
bitfield =
new std::atomic<unsigned int>[chunk_count] ();
104 for (
size_t it = 0; it < chunk_count; it++)
118 bitmap->
bitfield[chunk_count - 1] = chunk;
140 int i, chunk_idx, slot_idx;
158 #if defined (SERVER_MODE) 161 start_idx = start_idx % ((
unsigned int) chunk_count);
179 if (i >= chunk_count)
184 while (i != (
int) start_idx);
215 chunk = bitmap->
bitfield[chunk_idx].load ();
222 while (!bitmap->
bitfield[chunk_idx].compare_exchange_weak (chunk, chunk | mask));
229 #if !defined (SERVER_MODE) 233 return chunk_idx * LF_BITFIELD_WORD_SIZE + slot_idx;
239 unsigned int mask, inverse_mask, curr;
249 inverse_mask = (
unsigned int) (1 << bit);
250 mask = ~inverse_mask;
255 curr = bitmap->
bitfield[pos].load ();
257 if (! (curr & inverse_mask))
263 while (!bitmap->
bitfield[pos].compare_exchange_weak (curr, curr & mask));
270 #if !defined (SERVER_MODE) static const float FULL_USAGE_RATIO
static const LF_BITMAP_STYLE LF_BITMAP_ONE_CHUNK
static void lf_bitmap_destroy(LF_BITMAP *bitmap)
void free_entry(int entry_idx)
#define LF_BITMAP_IS_FULL(bitmap)
static const float NINTETYFIVE_PERCENTILE_USAGE_RATIO
static void lf_bitmap_init(LF_BITMAP *bitmap, LF_BITMAP_STYLE style, int entries_cnt, float usage_threshold)
std::atomic< int > entry_count_in_use
static const LF_BITMAP_STYLE LF_BITMAP_LIST_OF_CHUNKS
#define LF_BITFIELD_WORD_SIZE
#define CEIL_PTVDIV(dividend, divisor)
std::atomic< unsigned int > * bitfield
static void lf_bitmap_free_entry(LF_BITMAP *bitmap, int entry_idx)
std::atomic< unsigned int > start_idx
static int lf_bitmap_get_entry(LF_BITMAP *bitmap)
void init(chunking_style style, int entries_count, float usage_ratio)