Fix bugs.
authorRobert Haas <rhaas@postgresql.org>
Wed, 9 Apr 2014 18:18:18 +0000 (18:18 +0000)
committerRobert Haas <rhaas@postgresql.org>
Wed, 9 Apr 2014 18:18:18 +0000 (18:18 +0000)
src/backend/utils/mmgr/sb_alloc.c
src/backend/utils/mmgr/sb_region.c

index f97a52d7f222ac5e360600e9fb6594c7922becca..69ca093383213499e8dc998505868dfbc925f35e 100644 (file)
@@ -430,8 +430,8 @@ sb_alloc_from_heap(char *base, sb_heap *heap, Size obsize, Size nmax)
                for (fclass = 2; fclass < SB_FULLNESS_CLASSES - 1; ++fclass)
                        if (sb_transfer_first_span(base, heap, fclass, 1))
                                break;
-               if (relptr_is_null(heap->spans[1]))
-                       if (!sb_transfer_first_span(base, heap, 0, 1))
+               if (relptr_is_null(heap->spans[1]) &&
+                       !sb_transfer_first_span(base, heap, 0, 1))
                                return NULL;
        }
 
index 6d1737c4dfce017b431fea40339ebf44be6095c4..4de545a687d5795d17704ce8b239f0e841541f7b 100644 (file)
@@ -519,6 +519,7 @@ sb_adjust_lookup_leaf(sb_lookup_leaf *leaf, sb_region *region, bool insert)
 
                newsize = leaf->nallocated == 0 ? 16 : leaf->nallocated * 2;
                newtab = malloc(sizeof(sb_region *) * newsize);
+               leaf->nallocated = newsize;
                if (newtab == NULL)
                        return false;
                if (leaf->nused > 0)
@@ -552,8 +553,8 @@ sb_adjust_lookup_leaf(sb_lookup_leaf *leaf, sb_region *region, bool insert)
                Assert(low == leaf->nused || 
                                leaf->region[low]->region_start > region->region_start);
                if (low < leaf->nused)
-                       memmove(&leaf->region[low], &leaf->region[low + 1],
-                                       sizeof(sb_region *) * (leaf->nused - low - 1));
+                       memmove(&leaf->region[low + 1], &leaf->region[low],
+                                       sizeof(sb_region *) * (leaf->nused - low));
                leaf->region[low] = region;
                ++leaf->nused;
        }
@@ -561,7 +562,7 @@ sb_adjust_lookup_leaf(sb_lookup_leaf *leaf, sb_region *region, bool insert)
        {
                Assert(leaf->region[low] == region);
                if (low < leaf->nused - 1)
-                       memmove(&leaf->region[low + 1], &leaf->region[low],
+                       memmove(&leaf->region[low], &leaf->region[low + 1],
                                        sizeof(sb_region *) * (leaf->nused - low - 1));
                --leaf->nused;          
        }
@@ -608,7 +609,7 @@ sb_find_leaf(Size highbits, bool insert)
        {
                if (lookup_root.cache_value[i] == NULL)
                        unused = i;
-               else if (lookup_root.cache_key[i] == highbits)
+               else if (lookup_root.cache_key[i] == rootbits)
                        l2 = lookup_root.cache_value[i];
        }
 
@@ -641,7 +642,7 @@ sb_find_leaf(Size highbits, bool insert)
                        return NULL;
                if (unused != -1)
                {
-                       lookup_root.cache_key[unused] = highbits;
+                       lookup_root.cache_key[unused] = rootbits;
                        lookup_root.cache_value[unused] = l2;
                }
                else if (lookup_root.l2 != NULL)
@@ -663,7 +664,7 @@ sb_find_leaf(Size highbits, bool insert)
 
        /* Find slot for entry, and try to initialize it if needed. */
        leafptr = &l2->leaf[highbits & (SB_LOOKUP_L2_ENTRIES - 1)];
-       if (insert || *leafptr == NULL)
+       if (insert && *leafptr == NULL)
                *leafptr = calloc(1, sizeof(sb_lookup_leaf));
 
        return *leafptr;