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. */
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);
}
}
* 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;
}
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;