Fix bugs.
authorRobert Haas <rhaas@postgresql.org>
Thu, 10 Apr 2014 16:43:56 +0000 (16:43 +0000)
committerRobert Haas <rhaas@postgresql.org>
Thu, 10 Apr 2014 16:43:56 +0000 (16:43 +0000)
src/backend/utils/mmgr/sb_alloc.c

index 69ca093383213499e8dc998505868dfbc925f35e..760839bb56f3003906920617fada7293a4b6a963 100644 (file)
@@ -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;