bugfixed: allocator_array_check_capacity alloc size

pull/37/head
YuQing 2020-03-29 22:03:13 +08:00
parent 427818d005
commit 0810cb4d21
2 changed files with 30 additions and 7 deletions

1
.gitignore vendored
View File

@ -49,6 +49,7 @@ src/tests/test_split_string
src/tests/test_uniq_skiplist src/tests/test_uniq_skiplist
src/tests/test_server_id_func src/tests/test_server_id_func
src/tests/test_pipe src/tests/test_pipe
src/tests/test_atomic
# other # other
*.swp *.swp

View File

@ -66,26 +66,48 @@ static int allocator_array_check_capacity(struct fast_allocator_context *acontex
{ {
int result; int result;
int bytes; int bytes;
int target_count;
int alloc_count;
struct fast_allocator_info **new_allocators; struct fast_allocator_info **new_allocators;
if (acontext->allocator_array.alloc >= acontext->allocator_array.count + target_count = acontext->allocator_array.count + allocator_count;
allocator_count) if (acontext->allocator_array.alloc >= target_count)
{ {
return 0; return 0;
} }
if (acontext->allocator_array.alloc == 0) if (acontext->allocator_array.alloc == 0)
{ {
acontext->allocator_array.alloc = 2 * allocator_count; if (target_count < 128)
{
alloc_count = 128;
}
else if (target_count < 256)
{
alloc_count = 256;
}
else if (target_count < 512)
{
alloc_count = 512;
}
else if (target_count < 1024)
{
alloc_count = 1024;
}
else
{
alloc_count = 2 * target_count;
}
} }
else else
{ {
alloc_count = acontext->allocator_array.alloc;
do do
{ {
acontext->allocator_array.alloc *= 2; alloc_count *= 2;
} while (acontext->allocator_array.alloc < allocator_count); } while (alloc_count < target_count);
} }
bytes = sizeof(struct fast_allocator_info*) * acontext->allocator_array.alloc; bytes = sizeof(struct fast_allocator_info *) * alloc_count;
new_allocators = (struct fast_allocator_info **)malloc(bytes); new_allocators = (struct fast_allocator_info **)malloc(bytes);
if (new_allocators == NULL) if (new_allocators == NULL)
{ {
@ -103,6 +125,7 @@ static int allocator_array_check_capacity(struct fast_allocator_context *acontex
acontext->allocator_array.count); acontext->allocator_array.count);
free(acontext->allocator_array.allocators); free(acontext->allocator_array.allocators);
} }
acontext->allocator_array.alloc = alloc_count;
acontext->allocator_array.allocators = new_allocators; acontext->allocator_array.allocators = new_allocators;
return 0; return 0;
} }
@ -132,7 +155,6 @@ static int region_init(struct fast_allocator_context *acontext,
} }
memset(region->allocators, 0, bytes); memset(region->allocators, 0, bytes);
if ((result=allocator_array_check_capacity(acontext, allocator_count)) != 0) if ((result=allocator_array_check_capacity(acontext, allocator_count)) != 0)
{ {
return result; return result;