提交 4cf6e9e0 编写于 作者: T Tom Lane

Avoid corner cases where aset.c would unnecessarily make malloc()

requests of sizes that aren't powers of 2.  Per observation from
David Schultz, 28-Aug.
上级 c472b836
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/mmgr/aset.c,v 1.52 2003/08/04 02:40:08 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/mmgr/aset.c,v 1.53 2003/09/13 22:25:38 tgl Exp $
* *
* NOTE: * NOTE:
* This is a new (Feb. 05, 1999) implementation of the allocation set * This is a new (Feb. 05, 1999) implementation of the allocation set
...@@ -650,32 +650,29 @@ AllocSetAlloc(MemoryContext context, Size size) ...@@ -650,32 +650,29 @@ AllocSetAlloc(MemoryContext context, Size size)
} }
else else
{ {
/* Get size of prior block */
blksize = set->blocks->endptr - ((char *) set->blocks);
/* /*
* Special case: if very first allocation was for a large * Use first power of 2 that is larger than previous block,
* chunk (or we have a small "keeper" block), could have an * but not more than the allowed limit. (We don't simply double
* undersized top block. Do something reasonable. * the prior block size, because in some cases this could be a
* funny size, eg if very first allocation was for an odd-sized
* large chunk.)
*/ */
if (blksize < set->initBlockSize) Size pblksize = set->blocks->endptr - ((char *) set->blocks);
blksize = set->initBlockSize;
else blksize = set->initBlockSize;
{ while (blksize <= pblksize)
/* Crank it up, but not past max */
blksize <<= 1; blksize <<= 1;
if (blksize > set->maxBlockSize) if (blksize > set->maxBlockSize)
blksize = set->maxBlockSize; blksize = set->maxBlockSize;
}
} }
/* /*
* If initBlockSize is less than ALLOC_CHUNK_LIMIT, we could need * If initBlockSize is less than ALLOC_CHUNK_LIMIT, we could need
* more space... * more space... but try to keep it a power of 2.
*/ */
required_size = chunk_size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ; required_size = chunk_size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ;
if (blksize < required_size) while (blksize < required_size)
blksize = required_size; blksize <<= 1;
/* Try to allocate it */ /* Try to allocate it */
block = (AllocBlock) malloc(blksize); block = (AllocBlock) malloc(blksize);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册