summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2014-04-26 18:14:28 +0000
committerTom Lane2014-04-26 18:14:28 +0000
commit528c454b2ada89ca0f0cd9a64f939e775b55b879 (patch)
tree6cb9277a7bc417afe27c035f1bb9e8406fb85734
parent39b0c7681e465f3e486ca2a5d13fbbafbe25cb1a (diff)
Don't #include utils/palloc.h in common/fe_memutils.h.
This breaks the principle that common/ ought not depend on anything in the server, not only code-wise but in the headers. The only arguable advantage is avoidance of duplication of half a dozen extern declarations, and even that is rather dubious, considering that the previous coding was wrong about which declarations to duplicate: it exposed pnstrdup() to frontend code even though no such function is provided in fe_memutils.c. On the same principle, don't #include utils/memutils.h in the frontend build of psprintf.c. This requires duplicating the definition of MaxAllocSize, but that seems fine to me: there's no a-priori reason why frontend code should use the same size limit as the backend anyway. In passing, clean up some rather odd layout and ordering choices that were imposed on palloc.h to reduce the number of #ifdefs required by the previous approach. Per gripe from Christoph Berg. There's still more work to do to make include/common/ clean, but this part seems reasonably noncontroversial.
-rw-r--r--src/common/psprintf.c11
-rw-r--r--src/include/common/fe_memutils.h14
-rw-r--r--src/include/utils/palloc.h25
3 files changed, 32 insertions, 18 deletions
diff --git a/src/common/psprintf.c b/src/common/psprintf.c
index 026040f7b7..b01e195360 100644
--- a/src/common/psprintf.c
+++ b/src/common/psprintf.c
@@ -15,12 +15,19 @@
*/
#ifndef FRONTEND
+
#include "postgres.h"
+
+#include "utils/memutils.h"
+
#else
+
#include "postgres_fe.h"
-#endif
-#include "utils/memutils.h"
+/* It's possible we could use a different value for this in frontend code */
+#define MaxAllocSize ((Size) 0x3fffffff) /* 1 gigabyte - 1 */
+
+#endif
/*
diff --git a/src/include/common/fe_memutils.h b/src/include/common/fe_memutils.h
index 96ee7b3ef6..3da1891ef2 100644
--- a/src/include/common/fe_memutils.h
+++ b/src/include/common/fe_memutils.h
@@ -9,12 +9,24 @@
#ifndef FE_MEMUTILS_H
#define FE_MEMUTILS_H
+/* "Safe" memory allocation functions --- these exit(1) on failure */
extern char *pg_strdup(const char *in);
extern void *pg_malloc(size_t size);
extern void *pg_malloc0(size_t size);
extern void *pg_realloc(void *pointer, size_t size);
extern void pg_free(void *pointer);
-#include "utils/palloc.h"
+/* Equivalent functions, deliberately named the same as backend functions */
+extern char *pstrdup(const char *in);
+extern void *palloc(Size size);
+extern void *palloc0(Size size);
+extern void *repalloc(void *pointer, Size size);
+extern void pfree(void *pointer);
+
+/* sprintf into a palloc'd buffer --- these are in psprintf.c */
+extern char *psprintf(const char *fmt,...)
+__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2)));
+extern size_t pvsnprintf(char *buf, size_t len, const char *fmt, va_list args)
+__attribute__((format(PG_PRINTF_ATTRIBUTE, 3, 0)));
#endif /* FE_MEMUTILS_H */
diff --git a/src/include/utils/palloc.h b/src/include/utils/palloc.h
index ff440f7c89..61d03351d1 100644
--- a/src/include/utils/palloc.h
+++ b/src/include/utils/palloc.h
@@ -35,12 +35,10 @@
*/
typedef struct MemoryContextData *MemoryContext;
-#ifndef FRONTEND
-
/*
* CurrentMemoryContext is the default allocation context for palloc().
- * We declare it here so that palloc() can be a macro. Avoid accessing it
- * directly! Instead, use MemoryContextSwitchTo() to change the setting.
+ * Avoid accessing it directly! Instead, use MemoryContextSwitchTo()
+ * to change the setting.
*/
extern PGDLLIMPORT MemoryContext CurrentMemoryContext;
@@ -51,9 +49,10 @@ extern void *MemoryContextAlloc(MemoryContext context, Size size);
extern void *MemoryContextAllocZero(MemoryContext context, Size size);
extern void *MemoryContextAllocZeroAligned(MemoryContext context, Size size);
-/* Higher-limit allocators. */
-extern void *MemoryContextAllocHuge(MemoryContext context, Size size);
-extern void *repalloc_huge(void *pointer, Size size);
+extern void *palloc(Size size);
+extern void *palloc0(Size size);
+extern void *repalloc(void *pointer, Size size);
+extern void pfree(void *pointer);
/*
* The result of palloc() is always word-aligned, so we can skip testing
@@ -68,6 +67,10 @@ extern void *repalloc_huge(void *pointer, Size size);
MemoryContextAllocZeroAligned(CurrentMemoryContext, sz) : \
MemoryContextAllocZero(CurrentMemoryContext, sz) )
+/* Higher-limit allocators. */
+extern void *MemoryContextAllocHuge(MemoryContext context, Size size);
+extern void *repalloc_huge(void *pointer, Size size);
+
/*
* MemoryContextSwitchTo can't be a macro in standard C compilers.
* But we can make it an inline function if the compiler supports it.
@@ -93,17 +96,9 @@ MemoryContextSwitchTo(MemoryContext context)
* allocated in a context, not with malloc().
*/
extern char *MemoryContextStrdup(MemoryContext context, const char *string);
-#endif /* !FRONTEND */
-
extern char *pstrdup(const char *in);
extern char *pnstrdup(const char *in, Size len);
-/* basic memory allocation functions */
-extern void *palloc(Size size);
-extern void *palloc0(Size size);
-extern void pfree(void *pointer);
-extern void *repalloc(void *pointer, Size size);
-
/* sprintf into a palloc'd buffer --- these are in psprintf.c */
extern char *psprintf(const char *fmt,...)
__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2)));