Files
openGauss-server/src/lib/pgcommon/fe_memutils.cpp
2020-09-28 19:18:06 +08:00

111 lines
2.3 KiB
C++

/* ---------------------------------------------------------------------------------------
*
* fe_memutils.cpp
* memory management support for frontend code
*
* Portions Copyright (c) 2020 Huawei Technologies Co.,Ltd.
* Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
*
* IDENTIFICATION
* src/lib/pgcommon/fe_memutils.cpp
*
* -------------------------------------------------------------------------
*/
#include "postgres_fe.h"
#include "common/fe_memutils.h"
static inline void* pg_malloc_internal(size_t size, int flags)
{
void* tmp = NULL;
errno_t rc = EOK;
/* Avoid unportable behavior of malloc(0) */
if (size == 0)
size = 1;
tmp = malloc(size);
if (tmp == NULL) {
if ((flags & MCXT_ALLOC_NO_OOM) == 0) {
fprintf(stderr, _("out of memory\n"));
exit(EXIT_FAILURE);
}
return NULL;
}
if ((flags & MCXT_ALLOC_ZERO) != 0) {
rc = memset_s(tmp, size, 0, size);
securec_check_ss_c(rc, "\0", "\0");
}
return tmp;
}
void* pg_malloc(size_t size)
{
return pg_malloc_internal(size, 0);
}
void *
pg_malloc0(size_t size)
{
return pg_malloc_internal(size, MCXT_ALLOC_ZERO);
}
void* pg_realloc(void* ptr, size_t size)
{
void* tmp = NULL;
/* Avoid unportable behavior of realloc(NULL, 0) */
if (ptr == NULL && size == 0)
size = 1;
tmp = realloc(ptr, size);
if (NULL == tmp) {
fprintf(stderr, _("out of memory\n"));
exit(EXIT_FAILURE);
}
return tmp;
}
/*
* "Safe" wrapper around strdup().
*/
char* pg_strdup(const char* in)
{
char* tmp = NULL;
if (NULL == in) {
fprintf(stderr, _("cannot duplicate null pointer (internal error)\n"));
exit(EXIT_FAILURE);
}
tmp = strdup(in);
if (NULL == tmp) {
fprintf(stderr, _("out of memory\n"));
exit(EXIT_FAILURE);
}
return tmp;
}
void pg_free(void* ptr)
{
if (ptr != NULL) {
free(ptr);
ptr = NULL;
}
}
void* palloc_extended(Size size, int flags)
{
return pg_malloc_internal(size, flags);
}
void* palloc(Size size)
{
return pg_malloc_internal(size, 0);
}
void pfree(void* pointer)
{
pg_free(pointer);
}