From: Robert Haas Date: Thu, 10 Apr 2014 16:43:56 +0000 (+0000) Subject: Fix bugs. X-Git-Url: http://waps.l3s.uni-hannover.de/gitweb/?a=commitdiff_plain;h=2dad5598ac2b17bf001c8ebeec203a3bbea3b6eb;p=users%2Frhaas%2Fpostgres.git Fix bugs. --- diff --git a/src/backend/utils/mmgr/sb_alloc.c b/src/backend/utils/mmgr/sb_alloc.c index 69ca093383..760839bb56 100644 --- a/src/backend/utils/mmgr/sb_alloc.c +++ b/src/backend/utils/mmgr/sb_alloc.c @@ -43,7 +43,7 @@ struct sb_span relptr(sb_heap) parent; /* Containing heap. */ relptr(sb_span) prevspan; /* Previous span. */ relptr(sb_span) nextspan; /* Next span. */ - Size first_page; /* Starting page number. */ + relptr(char) start; /* Starting page number. */ Size npages; /* Length of span in pages. */ uint16 size_class; /* Size class. */ uint16 ninitialized; /* Maximum number of objects ever allocated. */ @@ -312,27 +312,19 @@ sb_reset_allocator(sb_allocator *a) sb_region *region; char *superblock; sb_span *span; - char *fpm_base; - Size first_page; span = relptr_access(base, heap->spans[fclass]); while (span != NULL) { - superblock = base + span->first_page * FPM_PAGE_SIZE; + Size offset; + + superblock = relptr_access(base, span->start); region = sb_lookup_region(superblock); Assert(region != NULL); - fpm_base = fpm_segment_base(region->fpm); - - /* - * XXX. Here's where the wheels are going to come - * off if it turns out that malloc returns somethign that isn't - * page-aligned.... what do we do about this? Maybe we should - * rejigger things so that the fpm base is NULL for all private - * stuff. - */ - first_page = (superblock - fpm_base) / FPM_PAGE_SIZE; - FreePageManagerPut(region->fpm, first_page, span->npages); - + offset = superblock - fpm_segment_base(region->fpm); + Assert(offset % FPM_PAGE_SIZE == 0); + FreePageManagerPut(region->fpm, offset / FPM_PAGE_SIZE, + span->npages); span = relptr_access(base, span->nextspan); } } @@ -441,18 +433,21 @@ sb_alloc_from_heap(char *base, sb_heap *heap, Size obsize, Size nmax) * free list or, failing that, initialize a new object. */ active_sb = relptr_access(base, heap->spans[1]); - superblock = base + active_sb->first_page * FPM_PAGE_SIZE; + superblock = relptr_access(base, active_sb->start); Assert(active_sb != NULL); Assert(active_sb->nused < nmax); Assert(active_sb->nused <= active_sb->ninitialized); if (active_sb->firstfree < nmax) { result = superblock + active_sb->firstfree * obsize; + elog(FATAL, "superblock at %p points to %p reallocating %d of %zu result %p", + active_sb, superblock, active_sb->firstfree, nmax, result); active_sb->firstfree = * (Size *) result; } else { Assert(active_sb->ninitialized < nmax); + Assert(active_sb->ninitialized == active_sb->nused); result = superblock + active_sb->ninitialized * obsize; ++active_sb->ninitialized; } @@ -598,7 +593,7 @@ sb_init_span(char *base, sb_span *span, sb_heap *heap, char *ptr, relptr_store(base, span->nextspan, head); relptr_store(base, span->prevspan, (sb_span *) NULL); relptr_store(base, heap->spans[1], span); - span->first_page = (ptr - base) / FPM_PAGE_SIZE; + relptr_store(base, span->start, ptr); span->npages = npages; span->size_class = size_class; span->ninitialized = 0;