mirror of
https://github.com/postgres/postgres.git
synced 2025-07-08 11:42:09 +03:00
This adds additional variants of palloc, pg_malloc, etc. that encapsulate common usage patterns and provide more type safety. Specifically, this adds palloc_object(), palloc_array(), and repalloc_array(), which take the type name of the object to be allocated as its first argument and cast the return as a pointer to that type. There are also palloc0_object() and palloc0_array() variants for initializing with zero, and pg_malloc_*() variants of all of the above. Inspired by the talloc library. This is backpatched from master so that future backpatchable code can make use of these APIs. This patch by itself does not contain any users of these APIs. Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://www.postgresql.org/message-id/flat/bb755632-2a43-d523-36f8-a1e7a389a907@enterprisedb.com
74 lines
2.6 KiB
C
74 lines
2.6 KiB
C
/*
|
|
* fe_memutils.h
|
|
* memory management support for frontend code
|
|
*
|
|
* Copyright (c) 2003-2021, PostgreSQL Global Development Group
|
|
*
|
|
* src/include/common/fe_memutils.h
|
|
*/
|
|
#ifndef FE_MEMUTILS_H
|
|
#define FE_MEMUTILS_H
|
|
|
|
/*
|
|
* Flags for pg_malloc_extended and palloc_extended, deliberately named
|
|
* the same as the backend flags.
|
|
*/
|
|
#define MCXT_ALLOC_HUGE 0x01 /* allow huge allocation (> 1 GB) not
|
|
* actually used for frontends */
|
|
#define MCXT_ALLOC_NO_OOM 0x02 /* no failure if out-of-memory */
|
|
#define MCXT_ALLOC_ZERO 0x04 /* zero allocated memory */
|
|
|
|
/*
|
|
* "Safe" memory allocation functions --- these exit(1) on failure
|
|
* (except pg_malloc_extended with MCXT_ALLOC_NO_OOM)
|
|
*/
|
|
extern char *pg_strdup(const char *in);
|
|
extern void *pg_malloc(size_t size);
|
|
extern void *pg_malloc0(size_t size);
|
|
extern void *pg_malloc_extended(size_t size, int flags);
|
|
extern void *pg_realloc(void *pointer, size_t size);
|
|
extern void pg_free(void *pointer);
|
|
|
|
/*
|
|
* Variants with easier notation and more type safety
|
|
*/
|
|
|
|
/*
|
|
* Allocate space for one object of type "type"
|
|
*/
|
|
#define pg_malloc_object(type) ((type *) pg_malloc(sizeof(type)))
|
|
#define pg_malloc0_object(type) ((type *) pg_malloc0(sizeof(type)))
|
|
|
|
/*
|
|
* Allocate space for "count" objects of type "type"
|
|
*/
|
|
#define pg_malloc_array(type, count) ((type *) pg_malloc(sizeof(type) * (count)))
|
|
#define pg_malloc0_array(type, count) ((type *) pg_malloc0(sizeof(type) * (count)))
|
|
|
|
/*
|
|
* Change size of allocation pointed to by "pointer" to have space for "count"
|
|
* objects of type "type"
|
|
*/
|
|
#define pg_realloc_array(pointer, type, count) ((type *) pg_realloc(pointer, sizeof(type) * (count)))
|
|
|
|
/* Equivalent functions, deliberately named the same as backend functions */
|
|
extern char *pstrdup(const char *in);
|
|
extern char *pnstrdup(const char *in, Size size);
|
|
extern void *palloc(Size size);
|
|
extern void *palloc0(Size size);
|
|
extern void *palloc_extended(Size size, int flags);
|
|
extern void *repalloc(void *pointer, Size size);
|
|
extern void pfree(void *pointer);
|
|
|
|
#define palloc_object(type) ((type *) palloc(sizeof(type)))
|
|
#define palloc0_object(type) ((type *) palloc0(sizeof(type)))
|
|
#define palloc_array(type, count) ((type *) palloc(sizeof(type) * (count)))
|
|
#define palloc0_array(type, count) ((type *) palloc0(sizeof(type) * (count)))
|
|
#define repalloc_array(pointer, type, count) ((type *) repalloc(pointer, sizeof(type) * (count)))
|
|
|
|
/* sprintf into a palloc'd buffer --- these are in psprintf.c */
|
|
extern char *psprintf(const char *fmt,...) pg_attribute_printf(1, 2);
|
|
extern size_t pvsnprintf(char *buf, size_t len, const char *fmt, va_list args) pg_attribute_printf(3, 0);
|
|
|
|
#endif /* FE_MEMUTILS_H */
|