]> granicus.if.org Git - postgresql/commitdiff
Move out-of-memory error checks from aset.c to mcxt.c
authorRobert Haas <rhaas@postgresql.org>
Thu, 29 Jan 2015 15:23:38 +0000 (10:23 -0500)
committerRobert Haas <rhaas@postgresql.org>
Thu, 29 Jan 2015 15:23:38 +0000 (10:23 -0500)
This potentially allows us to add mcxt.c interfaces that do something
other than throw an error when memory cannot be allocated.  We'll
handle adding those interfaces in a separate commit.

Michael Paquier, with minor changes by me

src/backend/utils/mmgr/aset.c
src/backend/utils/mmgr/mcxt.c

index 85b3c9acd1a0687df27ddd6a9d06841bffcf990b..0759e39ecb6bbd5b4d189935263ad49294d10072 100644 (file)
@@ -642,8 +642,8 @@ AllocSetDelete(MemoryContext context)
 
 /*
  * AllocSetAlloc
- *             Returns pointer to allocated memory of given size; memory is added
- *             to the set.
+ *             Returns pointer to allocated memory of given size or NULL if
+ *             request could not be completed; memory is added to the set.
  *
  * No request may exceed:
  *             MAXALIGN_DOWN(SIZE_MAX) - ALLOC_BLOCKHDRSZ - ALLOC_CHUNKHDRSZ
@@ -671,13 +671,7 @@ AllocSetAlloc(MemoryContext context, Size size)
                blksize = chunk_size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ;
                block = (AllocBlock) malloc(blksize);
                if (block == NULL)
-               {
-                       MemoryContextStats(TopMemoryContext);
-                       ereport(ERROR,
-                                       (errcode(ERRCODE_OUT_OF_MEMORY),
-                                        errmsg("out of memory"),
-                                        errdetail("Failed on request of size %zu.", size)));
-               }
+                       return NULL;
                block->aset = set;
                block->freeptr = block->endptr = ((char *) block) + blksize;
 
@@ -865,13 +859,7 @@ AllocSetAlloc(MemoryContext context, Size size)
                }
 
                if (block == NULL)
-               {
-                       MemoryContextStats(TopMemoryContext);
-                       ereport(ERROR,
-                                       (errcode(ERRCODE_OUT_OF_MEMORY),
-                                        errmsg("out of memory"),
-                                        errdetail("Failed on request of size %zu.", size)));
-               }
+                       return NULL;
 
                block->aset = set;
                block->freeptr = ((char *) block) + ALLOC_BLOCKHDRSZ;
@@ -1002,9 +990,10 @@ AllocSetFree(MemoryContext context, void *pointer)
 
 /*
  * AllocSetRealloc
- *             Returns new pointer to allocated memory of given size; this memory
- *             is added to the set.  Memory associated with given pointer is copied
- *             into the new memory, and the old memory is freed.
+ *             Returns new pointer to allocated memory of given size or NULL if
+ *             request could not be completed; this memory is added to the set.
+ *             Memory associated with given pointer is copied into the new memory,
+ *             and the old memory is freed.
  *
  * Without MEMORY_CONTEXT_CHECKING, we don't know the old request size.  This
  * makes our Valgrind client requests less-precise, hazarding false negatives.
@@ -1107,13 +1096,7 @@ AllocSetRealloc(MemoryContext context, void *pointer, Size size)
                blksize = chksize + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ;
                block = (AllocBlock) realloc(block, blksize);
                if (block == NULL)
-               {
-                       MemoryContextStats(TopMemoryContext);
-                       ereport(ERROR,
-                                       (errcode(ERRCODE_OUT_OF_MEMORY),
-                                        errmsg("out of memory"),
-                                        errdetail("Failed on request of size %zu.", size)));
-               }
+                       return NULL;
                block->freeptr = block->endptr = ((char *) block) + blksize;
 
                /* Update pointers since block has likely been moved */
@@ -1179,6 +1162,10 @@ AllocSetRealloc(MemoryContext context, void *pointer, Size size)
                /* allocate new chunk */
                newPointer = AllocSetAlloc((MemoryContext) set, size);
 
+               /* leave immediately if request was not completed */
+               if (newPointer == NULL)
+                       return NULL;
+
                /*
                 * AllocSetAlloc() just made the region NOACCESS.  Change it to
                 * UNDEFINED for the moment; memcpy() will then transfer definedness
index aa0d458d25201ffe018d00e7b858f95bdf3b01e9..c62922a187a8fcc9db89cb4dd884a4d5989ed776 100644 (file)
@@ -623,6 +623,15 @@ MemoryContextAlloc(MemoryContext context, Size size)
        context->isReset = false;
 
        ret = (*context->methods->alloc) (context, size);
+       if (ret == NULL)
+       {
+               MemoryContextStats(TopMemoryContext);
+               ereport(ERROR,
+                               (errcode(ERRCODE_OUT_OF_MEMORY),
+                                errmsg("out of memory"),
+                                errdetail("Failed on request of size %zu.", size)));
+       }
+
        VALGRIND_MEMPOOL_ALLOC(context, ret, size);
 
        return ret;
@@ -649,6 +658,15 @@ MemoryContextAllocZero(MemoryContext context, Size size)
        context->isReset = false;
 
        ret = (*context->methods->alloc) (context, size);
+       if (ret == NULL)
+       {
+               MemoryContextStats(TopMemoryContext);
+               ereport(ERROR,
+                               (errcode(ERRCODE_OUT_OF_MEMORY),
+                                errmsg("out of memory"),
+                                errdetail("Failed on request of size %zu.", size)));
+       }
+
        VALGRIND_MEMPOOL_ALLOC(context, ret, size);
 
        MemSetAligned(ret, 0, size);
@@ -677,6 +695,15 @@ MemoryContextAllocZeroAligned(MemoryContext context, Size size)
        context->isReset = false;
 
        ret = (*context->methods->alloc) (context, size);
+       if (ret == NULL)
+       {
+               MemoryContextStats(TopMemoryContext);
+               ereport(ERROR,
+                               (errcode(ERRCODE_OUT_OF_MEMORY),
+                                errmsg("out of memory"),
+                                errdetail("Failed on request of size %zu.", size)));
+       }
+
        VALGRIND_MEMPOOL_ALLOC(context, ret, size);
 
        MemSetLoop(ret, 0, size);
@@ -699,6 +726,15 @@ palloc(Size size)
        CurrentMemoryContext->isReset = false;
 
        ret = (*CurrentMemoryContext->methods->alloc) (CurrentMemoryContext, size);
+       if (ret == NULL)
+       {
+               MemoryContextStats(TopMemoryContext);
+               ereport(ERROR,
+                               (errcode(ERRCODE_OUT_OF_MEMORY),
+                                errmsg("out of memory"),
+                                errdetail("Failed on request of size %zu.", size)));
+       }
+
        VALGRIND_MEMPOOL_ALLOC(CurrentMemoryContext, ret, size);
 
        return ret;
@@ -719,6 +755,15 @@ palloc0(Size size)
        CurrentMemoryContext->isReset = false;
 
        ret = (*CurrentMemoryContext->methods->alloc) (CurrentMemoryContext, size);
+       if (ret == NULL)
+       {
+               MemoryContextStats(TopMemoryContext);
+               ereport(ERROR,
+                               (errcode(ERRCODE_OUT_OF_MEMORY),
+                                errmsg("out of memory"),
+                                errdetail("Failed on request of size %zu.", size)));
+       }
+
        VALGRIND_MEMPOOL_ALLOC(CurrentMemoryContext, ret, size);
 
        MemSetAligned(ret, 0, size);
@@ -789,6 +834,12 @@ repalloc(void *pointer, Size size)
        Assert(!context->isReset);
 
        ret = (*context->methods->realloc) (context, pointer, size);
+       if (ret == NULL)
+               ereport(ERROR,
+                               (errcode(ERRCODE_OUT_OF_MEMORY),
+                                errmsg("out of memory"),
+                                errdetail("Failed on request of size %zu.", size)));
+
        VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size);
 
        return ret;
@@ -814,6 +865,15 @@ MemoryContextAllocHuge(MemoryContext context, Size size)
        context->isReset = false;
 
        ret = (*context->methods->alloc) (context, size);
+       if (ret == NULL)
+       {
+               MemoryContextStats(TopMemoryContext);
+               ereport(ERROR,
+                               (errcode(ERRCODE_OUT_OF_MEMORY),
+                                errmsg("out of memory"),
+                                errdetail("Failed on request of size %zu.", size)));
+       }
+
        VALGRIND_MEMPOOL_ALLOC(context, ret, size);
 
        return ret;
@@ -854,6 +914,12 @@ repalloc_huge(void *pointer, Size size)
        Assert(!context->isReset);
 
        ret = (*context->methods->realloc) (context, pointer, size);
+       if (ret == NULL)
+               ereport(ERROR,
+                               (errcode(ERRCODE_OUT_OF_MEMORY),
+                                errmsg("out of memory"),
+                                errdetail("Failed on request of size %zu.", size)));
+
        VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size);
 
        return ret;