We can allow this macro to accept either abbreviated or non-abbreviated
allocation parameters by making use of __VA_ARGS__. As noted by Andres
Freund, it's unlikely that any compiler would have __builtin_constant_p
but not __VA_ARGS__, so this gives up little or no error checking, and
it avoids a minor but annoying API break for extensions.
With this change, there is no reason for anybody to call
AllocSetContextCreateExtended directly, so in HEAD I renamed it to
AllocSetContextCreateInternal. It's probably too late for an ABI
break like that in 11, though.
Discussion: https://postgr.es/m/
20181012170355.bhxi273skjt6sag4@alap3.anarazel.de
*/
if (TransactionAbortContext == NULL)
TransactionAbortContext =
- AllocSetContextCreateExtended(TopMemoryContext,
- "TransactionAbortContext",
- 32 * 1024,
- 32 * 1024,
- 32 * 1024);
+ AllocSetContextCreate(TopMemoryContext,
+ "TransactionAbortContext",
+ 32 * 1024,
+ 32 * 1024,
+ 32 * 1024);
/*
* We shouldn't have a transaction context already.
/*
- * AllocSetContextCreateExtended
+ * AllocSetContextCreateInternal
* Create a new AllocSet context.
*
* parent: parent context, or NULL if top-level context
* maxBlockSize: maximum allocation block size
*
* Most callers should abstract the context size parameters using a macro
- * such as ALLOCSET_DEFAULT_SIZES. (This is now *required* when going
- * through the AllocSetContextCreate macro.)
+ * such as ALLOCSET_DEFAULT_SIZES.
+ *
+ * Note: don't call this directly; go through the wrapper macro
+ * AllocSetContextCreate.
*/
MemoryContext
-AllocSetContextCreateExtended(MemoryContext parent,
+AllocSetContextCreateInternal(MemoryContext parent,
const char *name,
Size minContextSize,
Size initBlockSize,
* This should be the last step in this function, as elog.c assumes memory
* management works once ErrorContext is non-null.
*/
- ErrorContext = AllocSetContextCreateExtended(TopMemoryContext,
- "ErrorContext",
- 8 * 1024,
- 8 * 1024,
- 8 * 1024);
+ ErrorContext = AllocSetContextCreate(TopMemoryContext,
+ "ErrorContext",
+ 8 * 1024,
+ 8 * 1024,
+ 8 * 1024);
MemoryContextAllowInCriticalSection(ErrorContext, true);
}
*/
/* aset.c */
-extern MemoryContext AllocSetContextCreateExtended(MemoryContext parent,
+extern MemoryContext AllocSetContextCreateInternal(MemoryContext parent,
const char *name,
Size minContextSize,
Size initBlockSize,
/*
* This wrapper macro exists to check for non-constant strings used as context
* names; that's no longer supported. (Use MemoryContextSetIdentifier if you
- * want to provide a variable identifier.) Note you must specify block sizes
- * with one of the abstraction macros below.
+ * want to provide a variable identifier.)
*/
#ifdef HAVE__BUILTIN_CONSTANT_P
-#define AllocSetContextCreate(parent, name, allocparams) \
+#define AllocSetContextCreate(parent, name, ...) \
(StaticAssertExpr(__builtin_constant_p(name), \
"memory context names must be constant strings"), \
- AllocSetContextCreateExtended(parent, name, allocparams))
+ AllocSetContextCreateInternal(parent, name, __VA_ARGS__))
#else
-#define AllocSetContextCreate(parent, name, allocparams) \
- AllocSetContextCreateExtended(parent, name, allocparams)
+#define AllocSetContextCreate \
+ AllocSetContextCreateInternal
#endif
/* slab.c */