Implement compile-time bitmap size computation.
This commit is contained in:
parent
6ef80d68f0
commit
f97e5ac4ec
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
/* Maximum bitmap bit count is 2^LG_BITMAP_MAXBITS. */
|
/* Maximum bitmap bit count is 2^LG_BITMAP_MAXBITS. */
|
||||||
#define LG_BITMAP_MAXBITS LG_RUN_MAXREGS
|
#define LG_BITMAP_MAXBITS LG_RUN_MAXREGS
|
||||||
|
#define BITMAP_MAXBITS (ZU(1) << LG_BITMAP_MAXBITS)
|
||||||
|
|
||||||
typedef struct bitmap_level_s bitmap_level_t;
|
typedef struct bitmap_level_s bitmap_level_t;
|
||||||
typedef struct bitmap_info_s bitmap_info_t;
|
typedef struct bitmap_info_s bitmap_info_t;
|
||||||
@ -14,6 +15,51 @@ typedef unsigned long bitmap_t;
|
|||||||
#define BITMAP_GROUP_NBITS (ZU(1) << LG_BITMAP_GROUP_NBITS)
|
#define BITMAP_GROUP_NBITS (ZU(1) << LG_BITMAP_GROUP_NBITS)
|
||||||
#define BITMAP_GROUP_NBITS_MASK (BITMAP_GROUP_NBITS-1)
|
#define BITMAP_GROUP_NBITS_MASK (BITMAP_GROUP_NBITS-1)
|
||||||
|
|
||||||
|
/* Number of groups required to store a given number of bits. */
|
||||||
|
#define BITMAP_BITS2GROUPS(nbits) \
|
||||||
|
((nbits + BITMAP_GROUP_NBITS_MASK) >> LG_BITMAP_GROUP_NBITS)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Number of groups required at a particular level for a given number of bits.
|
||||||
|
*/
|
||||||
|
#define BITMAP_GROUPS_L0(nbits) \
|
||||||
|
BITMAP_BITS2GROUPS(nbits)
|
||||||
|
#define BITMAP_GROUPS_L1(nbits) \
|
||||||
|
BITMAP_BITS2GROUPS(BITMAP_BITS2GROUPS(nbits))
|
||||||
|
#define BITMAP_GROUPS_L2(nbits) \
|
||||||
|
BITMAP_BITS2GROUPS(BITMAP_BITS2GROUPS(BITMAP_BITS2GROUPS((nbits))))
|
||||||
|
#define BITMAP_GROUPS_L3(nbits) \
|
||||||
|
BITMAP_BITS2GROUPS(BITMAP_BITS2GROUPS(BITMAP_BITS2GROUPS( \
|
||||||
|
BITMAP_BITS2GROUPS((nbits)))))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Assuming the number of levels, number of groups required for a given number
|
||||||
|
* of bits.
|
||||||
|
*/
|
||||||
|
#define BITMAP_GROUPS_1_LEVEL(nbits) \
|
||||||
|
BITMAP_GROUPS_L0(nbits)
|
||||||
|
#define BITMAP_GROUPS_2_LEVEL(nbits) \
|
||||||
|
(BITMAP_GROUPS_1_LEVEL(nbits) + BITMAP_GROUPS_L1(nbits))
|
||||||
|
#define BITMAP_GROUPS_3_LEVEL(nbits) \
|
||||||
|
(BITMAP_GROUPS_2_LEVEL(nbits) + BITMAP_GROUPS_L2(nbits))
|
||||||
|
#define BITMAP_GROUPS_4_LEVEL(nbits) \
|
||||||
|
(BITMAP_GROUPS_3_LEVEL(nbits) + BITMAP_GROUPS_L3(nbits))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Maximum number of groups required to support LG_BITMAP_MAXBITS.
|
||||||
|
*/
|
||||||
|
#if LG_BITMAP_MAXBITS <= LG_BITMAP_GROUP_NBITS
|
||||||
|
# define BITMAP_GROUPS_MAX BITMAP_GROUPS_1_LEVEL(BITMAP_MAXBITS)
|
||||||
|
#elif LG_BITMAP_MAXBITS <= LG_BITMAP_GROUP_NBITS * 2
|
||||||
|
# define BITMAP_GROUPS_MAX BITMAP_GROUPS_2_LEVEL(BITMAP_MAXBITS)
|
||||||
|
#elif LG_BITMAP_MAXBITS <= LG_BITMAP_GROUP_NBITS * 3
|
||||||
|
# define BITMAP_GROUPS_MAX BITMAP_GROUPS_3_LEVEL(BITMAP_MAXBITS)
|
||||||
|
#elif LG_BITMAP_MAXBITS <= LG_BITMAP_GROUP_NBITS * 4
|
||||||
|
# define BITMAP_GROUPS_MAX BITMAP_GROUPS_4_LEVEL(BITMAP_MAXBITS)
|
||||||
|
#else
|
||||||
|
# error "Unsupported bitmap size"
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Maximum number of levels possible. */
|
/* Maximum number of levels possible. */
|
||||||
#define BITMAP_MAX_LEVELS \
|
#define BITMAP_MAX_LEVELS \
|
||||||
(LG_BITMAP_MAXBITS / LG_SIZEOF_BITMAP) \
|
(LG_BITMAP_MAXBITS / LG_SIZEOF_BITMAP) \
|
||||||
|
18
src/bitmap.c
18
src/bitmap.c
@ -2,19 +2,6 @@
|
|||||||
#include "jemalloc/internal/jemalloc_internal.h"
|
#include "jemalloc/internal/jemalloc_internal.h"
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
/* Function prototypes for non-inline static functions. */
|
|
||||||
|
|
||||||
static size_t bits2groups(size_t nbits);
|
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
|
|
||||||
static size_t
|
|
||||||
bits2groups(size_t nbits)
|
|
||||||
{
|
|
||||||
|
|
||||||
return ((nbits >> LG_BITMAP_GROUP_NBITS) +
|
|
||||||
!!(nbits & BITMAP_GROUP_NBITS_MASK));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
bitmap_info_init(bitmap_info_t *binfo, size_t nbits)
|
bitmap_info_init(bitmap_info_t *binfo, size_t nbits)
|
||||||
@ -31,15 +18,16 @@ bitmap_info_init(bitmap_info_t *binfo, size_t nbits)
|
|||||||
* that requires only one group.
|
* that requires only one group.
|
||||||
*/
|
*/
|
||||||
binfo->levels[0].group_offset = 0;
|
binfo->levels[0].group_offset = 0;
|
||||||
group_count = bits2groups(nbits);
|
group_count = BITMAP_BITS2GROUPS(nbits);
|
||||||
for (i = 1; group_count > 1; i++) {
|
for (i = 1; group_count > 1; i++) {
|
||||||
assert(i < BITMAP_MAX_LEVELS);
|
assert(i < BITMAP_MAX_LEVELS);
|
||||||
binfo->levels[i].group_offset = binfo->levels[i-1].group_offset
|
binfo->levels[i].group_offset = binfo->levels[i-1].group_offset
|
||||||
+ group_count;
|
+ group_count;
|
||||||
group_count = bits2groups(group_count);
|
group_count = BITMAP_BITS2GROUPS(group_count);
|
||||||
}
|
}
|
||||||
binfo->levels[i].group_offset = binfo->levels[i-1].group_offset
|
binfo->levels[i].group_offset = binfo->levels[i-1].group_offset
|
||||||
+ group_count;
|
+ group_count;
|
||||||
|
assert(binfo->levels[i].group_offset <= BITMAP_GROUPS_MAX);
|
||||||
binfo->nlevels = i;
|
binfo->nlevels = i;
|
||||||
binfo->nbits = nbits;
|
binfo->nbits = nbits;
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,11 @@
|
|||||||
#include "test/jemalloc_test.h"
|
#include "test/jemalloc_test.h"
|
||||||
|
|
||||||
#if (LG_BITMAP_MAXBITS > 12)
|
|
||||||
# define MAXBITS 4500
|
|
||||||
#else
|
|
||||||
# define MAXBITS (1U << LG_BITMAP_MAXBITS)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
TEST_BEGIN(test_bitmap_size)
|
TEST_BEGIN(test_bitmap_size)
|
||||||
{
|
{
|
||||||
size_t i, prev_size;
|
size_t i, prev_size;
|
||||||
|
|
||||||
prev_size = 0;
|
prev_size = 0;
|
||||||
for (i = 1; i <= MAXBITS; i++) {
|
for (i = 1; i <= BITMAP_MAXBITS; i++) {
|
||||||
size_t size = bitmap_size(i);
|
size_t size = bitmap_size(i);
|
||||||
assert_true(size >= prev_size,
|
assert_true(size >= prev_size,
|
||||||
"Bitmap size is smaller than expected");
|
"Bitmap size is smaller than expected");
|
||||||
@ -24,7 +18,7 @@ TEST_BEGIN(test_bitmap_init)
|
|||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
for (i = 1; i <= MAXBITS; i++) {
|
for (i = 1; i <= BITMAP_MAXBITS; i++) {
|
||||||
bitmap_info_t binfo;
|
bitmap_info_t binfo;
|
||||||
bitmap_info_init(&binfo, i);
|
bitmap_info_init(&binfo, i);
|
||||||
{
|
{
|
||||||
@ -47,7 +41,7 @@ TEST_BEGIN(test_bitmap_set)
|
|||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
for (i = 1; i <= MAXBITS; i++) {
|
for (i = 1; i <= BITMAP_MAXBITS; i++) {
|
||||||
bitmap_info_t binfo;
|
bitmap_info_t binfo;
|
||||||
bitmap_info_init(&binfo, i);
|
bitmap_info_init(&binfo, i);
|
||||||
{
|
{
|
||||||
@ -70,7 +64,7 @@ TEST_BEGIN(test_bitmap_unset)
|
|||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
for (i = 1; i <= MAXBITS; i++) {
|
for (i = 1; i <= BITMAP_MAXBITS; i++) {
|
||||||
bitmap_info_t binfo;
|
bitmap_info_t binfo;
|
||||||
bitmap_info_init(&binfo, i);
|
bitmap_info_init(&binfo, i);
|
||||||
{
|
{
|
||||||
@ -99,7 +93,7 @@ TEST_BEGIN(test_bitmap_sfu)
|
|||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
for (i = 1; i <= MAXBITS; i++) {
|
for (i = 1; i <= BITMAP_MAXBITS; i++) {
|
||||||
bitmap_info_t binfo;
|
bitmap_info_t binfo;
|
||||||
bitmap_info_init(&binfo, i);
|
bitmap_info_init(&binfo, i);
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user