aboutsummaryrefslogtreecommitdiff
path: root/src/include/utils/palloc.h
diff options
context:
space:
mode:
authorPeter Eisentraut <peter@eisentraut.org>2022-09-14 06:04:24 +0200
committerPeter Eisentraut <peter@eisentraut.org>2022-09-14 06:08:51 +0200
commit7dd9b469bc56f853ce2a092a6575a587a8c45ccf (patch)
tree04ea6de60edf6a9047d53567ea5b77436620bd31 /src/include/utils/palloc.h
parente4c8288b32380b68bcd28000551cfefee7aca7b7 (diff)
downloadpostgresql-7dd9b469bc56f853ce2a092a6575a587a8c45ccf.tar.gz
postgresql-7dd9b469bc56f853ce2a092a6575a587a8c45ccf.zip
Expand palloc/pg_malloc API for more type safety
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
Diffstat (limited to 'src/include/utils/palloc.h')
-rw-r--r--src/include/utils/palloc.h22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/include/utils/palloc.h b/src/include/utils/palloc.h
index a5f435ee068..73067397f10 100644
--- a/src/include/utils/palloc.h
+++ b/src/include/utils/palloc.h
@@ -81,6 +81,28 @@ extern void *repalloc(void *pointer, Size size);
extern void pfree(void *pointer);
/*
+ * Variants with easier notation and more type safety
+ */
+
+/*
+ * Allocate space for one object of type "type"
+ */
+#define palloc_object(type) ((type *) palloc(sizeof(type)))
+#define palloc0_object(type) ((type *) palloc0(sizeof(type)))
+
+/*
+ * Allocate space for "count" objects of type "type"
+ */
+#define palloc_array(type, count) ((type *) palloc(sizeof(type) * (count)))
+#define palloc0_array(type, count) ((type *) palloc0(sizeof(type) * (count)))
+
+/*
+ * Change size of allocation pointed to by "pointer" to have space for "count"
+ * objects of type "type"
+ */
+#define repalloc_array(pointer, type, count) ((type *) repalloc(pointer, sizeof(type) * (count)))
+
+/*
* The result of palloc() is always word-aligned, so we can skip testing
* alignment of the pointer when deciding which MemSet variant to use.
* Note that this variant does not offer any advantage, and should not be