fixed the cache allocator's size_to_cache.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20897 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
6bad493439
commit
172b3066aa
@ -13,6 +13,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#define DEBUG_ALLOCATOR
|
#define DEBUG_ALLOCATOR
|
||||||
|
// #define TEST_ALL_CACHES_DURING_BOOT
|
||||||
|
|
||||||
static const size_t kBlockSizes[] = {
|
static const size_t kBlockSizes[] = {
|
||||||
16, 24, 32, 48, 64, 80, 96, 112,
|
16, 24, 32, 48, 64, 80, 96, 112,
|
||||||
@ -23,7 +24,9 @@ static const size_t kBlockSizes[] = {
|
|||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
static object_cache *sBlockCaches[sizeof(kBlockSizes) / sizeof(size_t)];
|
static const size_t kNumBlockSizes = sizeof(kBlockSizes) / sizeof(size_t) - 1;
|
||||||
|
|
||||||
|
static object_cache *sBlockCaches[kNumBlockSizes];
|
||||||
|
|
||||||
struct boundary_tag {
|
struct boundary_tag {
|
||||||
uint32 size;
|
uint32 size;
|
||||||
@ -38,18 +41,22 @@ static const uint32 kBoundaryMagic = 0x6da78d13;
|
|||||||
static object_cache *
|
static object_cache *
|
||||||
size_to_cache(size_t size)
|
size_to_cache(size_t size)
|
||||||
{
|
{
|
||||||
if (size <= 128)
|
if (size <= 16)
|
||||||
return sBlockCaches[size / 16];
|
return sBlockCaches[0];
|
||||||
|
else if (size <= 32)
|
||||||
|
return sBlockCaches[1 + (size - 16 - 1) / 8];
|
||||||
|
else if (size <= 128)
|
||||||
|
return sBlockCaches[3 + (size - 32 - 1) / 16];
|
||||||
else if (size <= 256)
|
else if (size <= 256)
|
||||||
return sBlockCaches[8 + (size - 128) / 32];
|
return sBlockCaches[9 + (size - 128 - 1) / 32];
|
||||||
else if (size <= 512)
|
else if (size <= 512)
|
||||||
return sBlockCaches[12 + (size - 256) / 64];
|
return sBlockCaches[13 + (size - 256 - 1) / 64];
|
||||||
else if (size <= 1024)
|
else if (size <= 1024)
|
||||||
return sBlockCaches[16 + (size - 512) / 128];
|
return sBlockCaches[17 + (size - 512 - 1) / 128];
|
||||||
else if (size <= 2048)
|
else if (size <= 2048)
|
||||||
return sBlockCaches[20 + (size - 1024) / 256];
|
return sBlockCaches[21 + (size - 1024 - 1) / 256];
|
||||||
else if (size <= 8192)
|
else if (size <= 8192)
|
||||||
return sBlockCaches[24 + (size - 2048) / 512];
|
return sBlockCaches[25 + (size - 2048 - 1) / 512];
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -135,5 +142,11 @@ block_allocator_init_rest()
|
|||||||
|
|
||||||
block_create_cache(index, false);
|
block_create_cache(index, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TEST_ALL_CACHES_DURING_BOOT
|
||||||
|
for (int index = 0; kBlockSizes[index] != 0; index++) {
|
||||||
|
block_free(block_alloc(kBlockSizes[index] - sizeof(boundary_tag)));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user