mcxt.c: In function ‘MemoryContextAllowInCriticalSection’:
mcxt.c:322: error: ‘struct MemoryContextData’ has no member named ‘allowInCriticalSection’
The member in MemoryContextData is defined as 'allowInCritSection' while the MemoryContextAllowInCriticalSection accesses the field as 'context->allowInCriticalSection'.
It's a bit difficult to attach the mark to the palloc calls, as neither the WAL_DEBUG or LWLOCK_STATS code is calling palloc directly, but marking specific MemoryContexts as sanctioned ought to work. I'll take a stab at that.
I came up with the attached patch. It adds a function called MemoryContextAllowInCriticalSection(), which can be used to exempt specific memory contexts from the assertion. The following contexts are exempted:
* ErrorContext * MdCxt, which is used in checkpointer to absorb fsync requests. (the checkpointer process as a whole is no longer exempt) * The temporary StringInfos used in WAL_DEBUG (a new memory "WAL Debug" context is now created for them) * LWLock stats hash table (a new "LWLock stats" context is created for it)
Barring objections, I'll commit this to master, and remove the assertion from REL9_4_STABLE.