mirror of
https://github.com/postgres/postgres.git
synced 2025-07-08 11:42:09 +03:00
Provide a way to supress the "out of memory" error when allocating.
Using the new interface MemoryContextAllocExtended, callers can specify MCXT_ALLOC_NO_OOM if they are prepared to handle a NULL return value. Michael Paquier, reviewed and somewhat revised by me.
This commit is contained in:
@ -711,6 +711,46 @@ MemoryContextAllocZeroAligned(MemoryContext context, Size size)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MemoryContextAllocExtended
|
||||||
|
* Allocate space within the specified context using the given flags.
|
||||||
|
*/
|
||||||
|
void *
|
||||||
|
MemoryContextAllocExtended(MemoryContext context, Size size, int flags)
|
||||||
|
{
|
||||||
|
void *ret;
|
||||||
|
|
||||||
|
AssertArg(MemoryContextIsValid(context));
|
||||||
|
AssertNotInCriticalSection(context);
|
||||||
|
|
||||||
|
if (((flags & MCXT_ALLOC_HUGE) != 0 && !AllocHugeSizeIsValid(size)) ||
|
||||||
|
((flags & MCXT_ALLOC_HUGE) == 0 && !AllocSizeIsValid(size)))
|
||||||
|
elog(ERROR, "invalid memory alloc request size %zu", size);
|
||||||
|
|
||||||
|
context->isReset = false;
|
||||||
|
|
||||||
|
ret = (*context->methods->alloc) (context, size);
|
||||||
|
if (ret == NULL)
|
||||||
|
{
|
||||||
|
if ((flags & MCXT_ALLOC_NO_OOM) == 0)
|
||||||
|
{
|
||||||
|
MemoryContextStats(TopMemoryContext);
|
||||||
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_OUT_OF_MEMORY),
|
||||||
|
errmsg("out of memory"),
|
||||||
|
errdetail("Failed on request of size %zu.", size)));
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
VALGRIND_MEMPOOL_ALLOC(context, ret, size);
|
||||||
|
|
||||||
|
if ((flags & MCXT_ALLOC_ZERO) != 0)
|
||||||
|
MemSetAligned(ret, 0, size);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
palloc(Size size)
|
palloc(Size size)
|
||||||
{
|
{
|
||||||
|
@ -42,12 +42,21 @@ typedef struct MemoryContextData *MemoryContext;
|
|||||||
*/
|
*/
|
||||||
extern PGDLLIMPORT MemoryContext CurrentMemoryContext;
|
extern PGDLLIMPORT MemoryContext CurrentMemoryContext;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Flags for MemoryContextAllocExtended.
|
||||||
|
*/
|
||||||
|
#define MCXT_ALLOC_HUGE 0x01 /* allow huge allocation (> 1 GB) */
|
||||||
|
#define MCXT_ALLOC_NO_OOM 0x02 /* no failure if out-of-memory */
|
||||||
|
#define MCXT_ALLOC_ZERO 0x04 /* zero allocated memory */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fundamental memory-allocation operations (more are in utils/memutils.h)
|
* Fundamental memory-allocation operations (more are in utils/memutils.h)
|
||||||
*/
|
*/
|
||||||
extern void *MemoryContextAlloc(MemoryContext context, Size size);
|
extern void *MemoryContextAlloc(MemoryContext context, Size size);
|
||||||
extern void *MemoryContextAllocZero(MemoryContext context, Size size);
|
extern void *MemoryContextAllocZero(MemoryContext context, Size size);
|
||||||
extern void *MemoryContextAllocZeroAligned(MemoryContext context, Size size);
|
extern void *MemoryContextAllocZeroAligned(MemoryContext context, Size size);
|
||||||
|
extern void *MemoryContextAllocExtended(MemoryContext context,
|
||||||
|
Size size, int flags);
|
||||||
|
|
||||||
extern void *palloc(Size size);
|
extern void *palloc(Size size);
|
||||||
extern void *palloc0(Size size);
|
extern void *palloc0(Size size);
|
||||||
|
Reference in New Issue
Block a user