提交 bf878582 编写于 作者: R Rich Felker

avoid over-allocation of brk on first malloc

if init_malloc returns positive (successful first init), malloc will
retry getting a chunk from the free bins rather than expanding the
heap again. also pass init_malloc a hint for the size of the initial
allocation.
上级 952987a0
...@@ -179,7 +179,7 @@ fail: ...@@ -179,7 +179,7 @@ fail:
return 0; return 0;
} }
static int init_malloc() static int init_malloc(size_t n)
{ {
static int init, waiters; static int init, waiters;
int state; int state;
...@@ -196,7 +196,7 @@ static int init_malloc() ...@@ -196,7 +196,7 @@ static int init_malloc()
mal.brk = __brk(0) + 2*SIZE_ALIGN-1 & -SIZE_ALIGN; mal.brk = __brk(0) + 2*SIZE_ALIGN-1 & -SIZE_ALIGN;
c = expand_heap(1); c = expand_heap(n);
if (!c) { if (!c) {
a_store(&init, 0); a_store(&init, 0);
...@@ -210,7 +210,7 @@ static int init_malloc() ...@@ -210,7 +210,7 @@ static int init_malloc()
a_store(&init, 2); a_store(&init, 2);
if (waiters) __wake(&init, -1, 1); if (waiters) __wake(&init, -1, 1);
return 0; return 1;
} }
static int adjust_size(size_t *n) static int adjust_size(size_t *n)
...@@ -347,7 +347,7 @@ void *malloc(size_t n) ...@@ -347,7 +347,7 @@ void *malloc(size_t n)
for (;;) { for (;;) {
uint64_t mask = mal.binmap & -(1ULL<<i); uint64_t mask = mal.binmap & -(1ULL<<i);
if (!mask) { if (!mask) {
init_malloc(); if (init_malloc(n) > 0) continue;
c = expand_heap(n); c = expand_heap(n);
if (!c) return 0; if (!c) return 0;
if (alloc_rev(c)) { if (alloc_rev(c)) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册