|
11 | 11 | * Portions Copyright (c) 1994, Regents of the University of California |
12 | 12 | * |
13 | 13 | * IDENTIFICATION |
14 | | - * $PostgreSQL: pgsql/src/backend/utils/mmgr/aset.c,v 1.68 2006/10/04 00:30:04 momjian Exp $ |
| 14 | + * $PostgreSQL: pgsql/src/backend/utils/mmgr/aset.c,v 1.69 2006/11/08 19:27:24 tgl Exp $ |
15 | 15 | * |
16 | 16 | * NOTE: |
17 | 17 | *This is a new (Feb. 05, 1999) implementation of the allocation set |
@@ -140,6 +140,7 @@ typedef struct AllocSetContext |
140 | 140 | /* Allocation parameters for this context: */ |
141 | 141 | SizeinitBlockSize;/* initial block size */ |
142 | 142 | SizemaxBlockSize;/* maximum block size */ |
| 143 | +SizenextBlockSize;/* next block size to allocate */ |
143 | 144 | AllocBlockkeeper;/* if not NULL, keep this block over resets */ |
144 | 145 | }AllocSetContext; |
145 | 146 |
|
@@ -325,6 +326,7 @@ AllocSetContextCreate(MemoryContext parent, |
325 | 326 | maxBlockSize=initBlockSize; |
326 | 327 | context->initBlockSize=initBlockSize; |
327 | 328 | context->maxBlockSize=maxBlockSize; |
| 329 | +context->nextBlockSize=initBlockSize; |
328 | 330 |
|
329 | 331 | /* |
330 | 332 | * Grab always-allocated space, if requested |
@@ -443,6 +445,9 @@ AllocSetReset(MemoryContext context) |
443 | 445 | block=next; |
444 | 446 | } |
445 | 447 |
|
| 448 | +/* Reset block size allocation sequence, too */ |
| 449 | +set->nextBlockSize=set->initBlockSize; |
| 450 | + |
446 | 451 | set->isReset= true; |
447 | 452 | } |
448 | 453 |
|
@@ -665,28 +670,14 @@ AllocSetAlloc(MemoryContext context, Size size) |
665 | 670 | { |
666 | 671 | Sizerequired_size; |
667 | 672 |
|
668 | | -if (set->blocks==NULL) |
669 | | -{ |
670 | | -/* First block of the alloc set, use initBlockSize */ |
671 | | -blksize=set->initBlockSize; |
672 | | -} |
673 | | -else |
674 | | -{ |
675 | | -/* |
676 | | - * Use first power of 2 that is larger than previous block, but |
677 | | - * not more than the allowed limit. (We don't simply double the |
678 | | - * prior block size, because in some cases this could be a funny |
679 | | - * size, eg if very first allocation was for an odd-sized large |
680 | | - * chunk.) |
681 | | - */ |
682 | | -Sizepblksize=set->blocks->endptr- ((char*)set->blocks); |
683 | | - |
684 | | -blksize=set->initBlockSize; |
685 | | -while (blksize <=pblksize) |
686 | | -blksize <<=1; |
687 | | -if (blksize>set->maxBlockSize) |
688 | | -blksize=set->maxBlockSize; |
689 | | -} |
| 673 | +/* |
| 674 | + * The first such block has size initBlockSize, and we double the |
| 675 | + * space in each succeeding block, but not more than maxBlockSize. |
| 676 | + */ |
| 677 | +blksize=set->nextBlockSize; |
| 678 | +set->nextBlockSize <<=1; |
| 679 | +if (set->nextBlockSize>set->maxBlockSize) |
| 680 | +set->nextBlockSize=set->maxBlockSize; |
690 | 681 |
|
691 | 682 | /* |
692 | 683 | * If initBlockSize is less than ALLOC_CHUNK_LIMIT, we could need more |
@@ -734,11 +725,8 @@ AllocSetAlloc(MemoryContext context, Size size) |
734 | 725 | * never need any space. Don't mark an oversize block as a keeper, |
735 | 726 | * however. |
736 | 727 | */ |
737 | | -if (set->blocks==NULL&&blksize==set->initBlockSize) |
738 | | -{ |
739 | | -Assert(set->keeper==NULL); |
| 728 | +if (set->keeper==NULL&&blksize==set->initBlockSize) |
740 | 729 | set->keeper=block; |
741 | | -} |
742 | 730 |
|
743 | 731 | block->next=set->blocks; |
744 | 732 | set->blocks=block; |
|