Fix bugs.
authorRobert Haas <rhaas@postgresql.org>
Fri, 11 Apr 2014 14:35:32 +0000 (14:35 +0000)
committerRobert Haas <rhaas@postgresql.org>
Fri, 11 Apr 2014 14:35:32 +0000 (14:35 +0000)
src/backend/utils/mmgr/freepage.c
src/backend/utils/mmgr/sb_alloc.c
src/backend/utils/mmgr/sb_region.c

index 39cd498671dedb3f44451b266345d6d397afc60b..a572fefb8cf1e8ea229c1a8a6eaef8a42efb6e47 100644 (file)
@@ -311,8 +311,8 @@ FreePageManagerPut(FreePageManager *fpm, Size first_page, Size npages)
 
                if (region != NULL && region->seg == NULL)
                {
-                       sb_report_contiguous_freespace(region, contiguous_pages);
                        fpm->largest_reported_chunk = contiguous_pages;
+                       sb_report_contiguous_freespace(region, contiguous_pages);
                }
                else
                {
index a2fd3ccc57ee9176c1fc4e9677d902d7d7524304..38b92762d4880cec30b38db74ef30b2ed3bc9384 100644 (file)
@@ -294,10 +294,10 @@ sb_reset_allocator(sb_allocator *a)
         * Iterate through heaps back to front.  We do it this way so that
         * spans-of-spans are freed last.
         */
-       for (heapno = SB_NUM_SIZE_CLASSES; heapno >= 0; --heapno)
+       for (heapno = SB_NUM_SIZE_CLASSES - 1; heapno >= 0; --heapno)
        {
                sb_heap *heap = &a->heaps[heapno];
-               Size    fclass;
+               int             fclass;
 
                for (fclass = 0; fclass < SB_FULLNESS_CLASSES; ++fclass)
                {
@@ -309,15 +309,17 @@ sb_reset_allocator(sb_allocator *a)
                        while (span != NULL)
                        {
                                Size    offset;
+                               sb_span *nextspan;
 
                                superblock = relptr_access(base, span->start);
+                               nextspan = relptr_access(base, span->nextspan);
                                region = sb_lookup_region(superblock);
                                Assert(region != NULL);
                                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);
+                               span = nextspan;
                        }
                }
        }
index 5d686c8d8050be7b4c3224621c0fd53a34aa05b9..34cf910809f48e6d48dc8189100c4bfc23e516cc 100644 (file)
@@ -371,6 +371,7 @@ sb_private_region_for_allocator(Size npages)
        region->region_start = region_start;
        region->region_size = region_size;
        region->usable_pages = new_region_net_pages;
+       sb_private_pages_allocated += region->usable_pages;
        region->seg = NULL;
        region->allocator = NULL;
        region->fpm = (FreePageManager *)