PostgreSQL Source Code git master
Loading...
Searching...
No Matches
mcxt.c File Reference
#include "postgres.h"
#include "mb/pg_wchar.h"
#include "miscadmin.h"
#include "utils/memdebug.h"
#include "utils/memutils.h"
#include "utils/memutils_internal.h"
#include "utils/memutils_memorychunk.h"
Include dependency graph for mcxt.c:

Go to the source code of this file.

Macros

#define BOGUS_MCTX(id)
 
#define AssertNotInCriticalSection(context)    Assert(CritSectionCount == 0 || (context)->allowInCritSection)
 
#define MCXT_METHOD(pointer, method)    mcxt_methods[GetMemoryChunkMethodID(pointer)].method
 

Functions

static void BogusFree (void *pointer)
 
static voidBogusRealloc (void *pointer, Size size, int flags)
 
static MemoryContext BogusGetChunkContext (void *pointer)
 
static Size BogusGetChunkSpace (void *pointer)
 
static void MemoryContextDeleteOnly (MemoryContext context)
 
static void MemoryContextCallResetCallbacks (MemoryContext context)
 
static void MemoryContextStatsInternal (MemoryContext context, int level, int max_level, int max_children, MemoryContextCounters *totals, bool print_to_stderr)
 
static void MemoryContextStatsPrint (MemoryContext context, void *passthru, const char *stats_string, bool print_to_stderr)
 
static MemoryContextMethodID GetMemoryChunkMethodID (const void *pointer)
 
static uint64 GetMemoryChunkHeader (const void *pointer)
 
static MemoryContext MemoryContextTraverseNext (MemoryContext curr, MemoryContext top)
 
void MemoryContextInit (void)
 
void MemoryContextReset (MemoryContext context)
 
void MemoryContextResetOnly (MemoryContext context)
 
void MemoryContextResetChildren (MemoryContext context)
 
void MemoryContextDelete (MemoryContext context)
 
void MemoryContextDeleteChildren (MemoryContext context)
 
void MemoryContextRegisterResetCallback (MemoryContext context, MemoryContextCallback *cb)
 
void MemoryContextUnregisterResetCallback (MemoryContext context, MemoryContextCallback *cb)
 
void MemoryContextSetIdentifier (MemoryContext context, const char *id)
 
void MemoryContextSetParent (MemoryContext context, MemoryContext new_parent)
 
void MemoryContextAllowInCriticalSection (MemoryContext context, bool allow)
 
MemoryContext GetMemoryChunkContext (void *pointer)
 
Size GetMemoryChunkSpace (void *pointer)
 
MemoryContext MemoryContextGetParent (MemoryContext context)
 
bool MemoryContextIsEmpty (MemoryContext context)
 
Size MemoryContextMemAllocated (MemoryContext context, bool recurse)
 
void MemoryContextMemConsumed (MemoryContext context, MemoryContextCounters *consumed)
 
void MemoryContextStats (MemoryContext context)
 
void MemoryContextStatsDetail (MemoryContext context, int max_level, int max_children, bool print_to_stderr)
 
void MemoryContextCreate (MemoryContext node, NodeTag tag, MemoryContextMethodID method_id, MemoryContext parent, const char *name)
 
voidMemoryContextAllocationFailure (MemoryContext context, Size size, int flags)
 
void MemoryContextSizeFailure (MemoryContext context, Size size, int flags)
 
voidMemoryContextAlloc (MemoryContext context, Size size)
 
voidMemoryContextAllocZero (MemoryContext context, Size size)
 
voidMemoryContextAllocExtended (MemoryContext context, Size size, int flags)
 
void HandleLogMemoryContextInterrupt (void)
 
void ProcessLogMemoryContextInterrupt (void)
 
voidpalloc (Size size)
 
voidpalloc0 (Size size)
 
voidpalloc_extended (Size size, int flags)
 
voidMemoryContextAllocAligned (MemoryContext context, Size size, Size alignto, int flags)
 
voidpalloc_aligned (Size size, Size alignto, int flags)
 
void pfree (void *pointer)
 
voidrepalloc (void *pointer, Size size)
 
voidrepalloc_extended (void *pointer, Size size, int flags)
 
voidrepalloc0 (void *pointer, Size oldsize, Size size)
 
voidMemoryContextAllocHuge (MemoryContext context, Size size)
 
voidrepalloc_huge (void *pointer, Size size)
 
charMemoryContextStrdup (MemoryContext context, const char *string)
 
charpstrdup (const char *in)
 
charpnstrdup (const char *in, Size len)
 
charpchomp (const char *in)
 

Variables

static const MemoryContextMethods mcxt_methods []
 
MemoryContext CurrentMemoryContext = NULL
 
MemoryContext TopMemoryContext = NULL
 
MemoryContext ErrorContext = NULL
 
MemoryContext PostmasterContext = NULL
 
MemoryContext CacheMemoryContext = NULL
 
MemoryContext MessageContext = NULL
 
MemoryContext TopTransactionContext = NULL
 
MemoryContext CurTransactionContext = NULL
 
MemoryContext PortalContext = NULL
 
static bool LogMemoryContextInProgress = false
 

Macro Definition Documentation

◆ AssertNotInCriticalSection

#define AssertNotInCriticalSection (   context)     Assert(CritSectionCount == 0 || (context)->allowInCritSection)

Definition at line 195 of file mcxt.c.

211{
212 uint64 header;
213
214 /*
215 * Try to detect bogus pointers handed to us, poorly though we can.
216 * Presumably, a pointer that isn't MAXALIGNED isn't pointing at an
217 * allocated chunk.
218 */
219 Assert(pointer == (const void *) MAXALIGN(pointer));
220
221 /* Allow access to the uint64 header */
222 VALGRIND_MAKE_MEM_DEFINED((char *) pointer - sizeof(uint64), sizeof(uint64));
223
224 header = *((const uint64 *) ((const char *) pointer - sizeof(uint64)));
225
226 /* Disallow access to the uint64 header */
227 VALGRIND_MAKE_MEM_NOACCESS((char *) pointer - sizeof(uint64), sizeof(uint64));
228
230}
231
232/*
233 * GetMemoryChunkHeader
234 * Return the uint64 chunk header which directly precedes 'pointer'.
235 *
236 * This is only used after GetMemoryChunkMethodID, so no need for error checks.
237 */
238static inline uint64
239GetMemoryChunkHeader(const void *pointer)
240{
241 uint64 header;
242
243 /* Allow access to the uint64 header */
244 VALGRIND_MAKE_MEM_DEFINED((char *) pointer - sizeof(uint64), sizeof(uint64));
245
246 header = *((const uint64 *) ((const char *) pointer - sizeof(uint64)));
247
248 /* Disallow access to the uint64 header */
249 VALGRIND_MAKE_MEM_NOACCESS((char *) pointer - sizeof(uint64), sizeof(uint64));
250
251 return header;
252}
253
254/*
255 * MemoryContextTraverseNext
256 * Helper function to traverse all descendants of a memory context
257 * without recursion.
258 *
259 * Recursion could lead to out-of-stack errors with deep context hierarchies,
260 * which would be unpleasant in error cleanup code paths.
261 *
262 * To process 'context' and all its descendants, use a loop like this:
263 *
264 * <process 'context'>
265 * for (MemoryContext curr = context->firstchild;
266 * curr != NULL;
267 * curr = MemoryContextTraverseNext(curr, context))
268 * {
269 * <process 'curr'>
270 * }
271 *
272 * This visits all the contexts in pre-order, that is a node is visited
273 * before its children.
274 */
275static MemoryContext
277{
278 /* After processing a node, traverse to its first child if any */
279 if (curr->firstchild != NULL)
280 return curr->firstchild;
281
282 /*
283 * After processing a childless node, traverse to its next sibling if
284 * there is one. If there isn't, traverse back up to the parent (which
285 * has already been visited, and now so have all its descendants). We're
286 * done if that is "top", otherwise traverse to its next sibling if any,
287 * otherwise repeat moving up.
288 */
289 while (curr->nextchild == NULL)
290 {
291 curr = curr->parent;
292 if (curr == top)
293 return NULL;
294 }
295 return curr->nextchild;
296}
297
298/*
299 * Support routines to trap use of invalid memory context method IDs
300 * (from calling pfree or the like on a bogus pointer). As a possible
301 * aid in debugging, we report the header word along with the pointer
302 * address (if we got here, there must be an accessible header word).
303 */
304static void
305BogusFree(void *pointer)
306{
307 elog(ERROR, "pfree called with invalid pointer %p (header 0x%016" PRIx64 ")",
308 pointer, GetMemoryChunkHeader(pointer));
309}
310
311static void *
312BogusRealloc(void *pointer, Size size, int flags)
313{
314 elog(ERROR, "repalloc called with invalid pointer %p (header 0x%016" PRIx64 ")",
315 pointer, GetMemoryChunkHeader(pointer));
316 return NULL; /* keep compiler quiet */
317}
318
319static MemoryContext
320BogusGetChunkContext(void *pointer)
321{
322 elog(ERROR, "GetMemoryChunkContext called with invalid pointer %p (header 0x%016" PRIx64 ")",
323 pointer, GetMemoryChunkHeader(pointer));
324 return NULL; /* keep compiler quiet */
325}
326
327static Size
328BogusGetChunkSpace(void *pointer)
329{
330 elog(ERROR, "GetMemoryChunkSpace called with invalid pointer %p (header 0x%016" PRIx64 ")",
331 pointer, GetMemoryChunkHeader(pointer));
332 return 0; /* keep compiler quiet */
333}
334
335
336/*****************************************************************************
337 * EXPORTED ROUTINES *
338 *****************************************************************************/
339
340
341/*
342 * MemoryContextInit
343 * Start up the memory-context subsystem.
344 *
345 * This must be called before creating contexts or allocating memory in
346 * contexts. TopMemoryContext and ErrorContext are initialized here;
347 * other contexts must be created afterwards.
348 *
349 * In normal multi-backend operation, this is called once during
350 * postmaster startup, and not at all by individual backend startup
351 * (since the backends inherit an already-initialized context subsystem
352 * by virtue of being forked off the postmaster). But in an EXEC_BACKEND
353 * build, each process must do this for itself.
354 *
355 * In a standalone backend this must be called during backend startup.
356 */
357void
359{
361
362 /*
363 * First, initialize TopMemoryContext, which is the parent of all others.
364 */
366 "TopMemoryContext",
368
369 /*
370 * Not having any other place to point CurrentMemoryContext, make it point
371 * to TopMemoryContext. Caller should change this soon!
372 */
374
375 /*
376 * Initialize ErrorContext as an AllocSetContext with slow growth rate ---
377 * we don't really expect much to be allocated in it. More to the point,
378 * require it to contain at least 8K at all times. This is the only case
379 * where retained memory in a context is *essential* --- we want to be
380 * sure ErrorContext still has some memory even if we've run out
381 * elsewhere! Also, allow allocations in ErrorContext within a critical
382 * section. Otherwise a PANIC will cause an assertion failure in the error
383 * reporting code, before printing out the real cause of the failure.
384 *
385 * This should be the last step in this function, as elog.c assumes memory
386 * management works once ErrorContext is non-null.
387 */
389 "ErrorContext",
390 8 * 1024,
391 8 * 1024,
392 8 * 1024);
394}
395
396/*
397 * MemoryContextReset
398 * Release all space allocated within a context and delete all its
399 * descendant contexts (but not the named context itself).
400 */
401void
403{
405
406 /* save a function call in common case where there are no children */
407 if (context->firstchild != NULL)
409
410 /* save a function call if no pallocs since startup or last reset */
411 if (!context->isReset)
412 MemoryContextResetOnly(context);
413}
414
415/*
416 * MemoryContextResetOnly
417 * Release all space allocated within a context.
418 * Nothing is done to the context's descendant contexts.
419 */
420void
422{
424
425 /* Nothing to do if no pallocs since startup or last reset */
426 if (!context->isReset)
427 {
429
430 /*
431 * If context->ident points into the context's memory, it will become
432 * a dangling pointer. We could prevent that by setting it to NULL
433 * here, but that would break valid coding patterns that keep the
434 * ident elsewhere, e.g. in a parent context. So for now we assume
435 * the programmer got it right.
436 */
437
438 context->methods->reset(context);
439 context->isReset = true;
440 }
441}
442
443/*
444 * MemoryContextResetChildren
445 * Release all space allocated within a context's descendants,
446 * but don't delete the contexts themselves. The named context
447 * itself is not touched.
448 */
449void
451{
453
454 for (MemoryContext curr = context->firstchild;
455 curr != NULL;
457 {
459 }
460}
461
462/*
463 * MemoryContextDelete
464 * Delete a context and its descendants, and release all space
465 * allocated therein.
466 *
467 * The type-specific delete routine removes all storage for the context,
468 * but we have to deal with descendant nodes here.
469 */
470void
472{
474
476
477 /*
478 * Delete subcontexts from the bottom up.
479 *
480 * Note: Do not use recursion here. A "stack depth limit exceeded" error
481 * would be unpleasant if we're already in the process of cleaning up from
482 * transaction abort. We also cannot use MemoryContextTraverseNext() here
483 * because we modify the tree as we go.
484 */
485 curr = context;
486 for (;;)
487 {
488 MemoryContext parent;
489
490 /* Descend down until we find a leaf context with no children */
491 while (curr->firstchild != NULL)
493
494 /*
495 * We're now at a leaf with no children. Free it and continue from the
496 * parent. Or if this was the original node, we're all done.
497 */
498 parent = curr->parent;
500
501 if (curr == context)
502 break;
503 curr = parent;
504 }
505}
506
507/*
508 * Subroutine of MemoryContextDelete,
509 * to delete a context that has no children.
510 * We must also delink the context from its parent, if it has one.
511 */
512static void
514{
516 /* We had better not be deleting TopMemoryContext ... */
517 Assert(context != TopMemoryContext);
518 /* And not CurrentMemoryContext, either */
519 Assert(context != CurrentMemoryContext);
520 /* All the children should've been deleted already */
521 Assert(context->firstchild == NULL);
522
523 /*
524 * It's not entirely clear whether 'tis better to do this before or after
525 * delinking the context; but an error in a callback will likely result in
526 * leaking the whole context (if it's not a root context) if we do it
527 * after, so let's do it before.
528 */
530
531 /*
532 * We delink the context from its parent before deleting it, so that if
533 * there's an error we won't have deleted/busted contexts still attached
534 * to the context tree. Better a leak than a crash.
535 */
537
538 /*
539 * Also reset the context's ident pointer, in case it points into the
540 * context. This would only matter if someone tries to get stats on the
541 * (already unlinked) context, which is unlikely, but let's be safe.
542 */
543 context->ident = NULL;
544
545 context->methods->delete_context(context);
546}
547
548/*
549 * MemoryContextDeleteChildren
550 * Delete all the descendants of the named context and release all
551 * space allocated therein. The named context itself is not touched.
552 */
553void
555{
557
558 /*
559 * MemoryContextDelete will delink the child from me, so just iterate as
560 * long as there is a child.
561 */
562 while (context->firstchild != NULL)
564}
565
566/*
567 * MemoryContextRegisterResetCallback
568 * Register a function to be called before next context reset/delete.
569 * Such callbacks will be called in reverse order of registration.
570 *
571 * The caller is responsible for allocating a MemoryContextCallback struct
572 * to hold the info about this callback request, and for filling in the
573 * "func" and "arg" fields in the struct to show what function to call with
574 * what argument. Typically the callback struct should be allocated within
575 * the specified context, since that means it will automatically be freed
576 * when no longer needed.
577 *
578 * Note that callers can assume this cannot fail.
579 */
580void
583{
585
586 /* Push onto head so this will be called before older registrants. */
587 cb->next = context->reset_cbs;
588 context->reset_cbs = cb;
589 /* Mark the context as non-reset (it probably is already). */
590 context->isReset = false;
591}
592
593/*
594 * MemoryContextUnregisterResetCallback
595 * Undo the effects of MemoryContextRegisterResetCallback.
596 *
597 * This can be used if a callback's effects are no longer required
598 * at some point before the context has been reset/deleted. It is the
599 * caller's responsibility to pfree the callback struct (if needed).
600 *
601 * An assertion failure occurs if the callback was not registered.
602 * We could alternatively define that case as a no-op, but that seems too
603 * likely to mask programming errors such as passing the wrong context.
604 */
605void
608{
610 *cur;
611
613
614 for (prev = NULL, cur = context->reset_cbs; cur != NULL;
615 prev = cur, cur = cur->next)
616 {
617 if (cur != cb)
618 continue;
619 if (prev)
620 prev->next = cur->next;
621 else
622 context->reset_cbs = cur->next;
623 return;
624 }
625 Assert(false);
626}
627
628/*
629 * MemoryContextCallResetCallbacks
630 * Internal function to call all registered callbacks for context.
631 */
632static void
634{
636
637 /*
638 * We pop each callback from the list before calling. That way, if an
639 * error occurs inside the callback, we won't try to call it a second time
640 * in the likely event that we reset or delete the context later.
641 */
642 while ((cb = context->reset_cbs) != NULL)
643 {
644 context->reset_cbs = cb->next;
645 cb->func(cb->arg);
646 }
647}
648
649/*
650 * MemoryContextSetIdentifier
651 * Set the identifier string for a memory context.
652 *
653 * An identifier can be provided to help distinguish among different contexts
654 * of the same kind in memory context stats dumps. The identifier string
655 * must live at least as long as the context it is for; typically it is
656 * allocated inside that context, so that it automatically goes away on
657 * context deletion. Pass id = NULL to forget any old identifier.
658 */
659void
660MemoryContextSetIdentifier(MemoryContext context, const char *id)
661{
663 context->ident = id;
664}
665
666/*
667 * MemoryContextSetParent
668 * Change a context to belong to a new parent (or no parent).
669 *
670 * We provide this as an API function because it is sometimes useful to
671 * change a context's lifespan after creation. For example, a context
672 * might be created underneath a transient context, filled with data,
673 * and then reparented underneath CacheMemoryContext to make it long-lived.
674 * In this way no special effort is needed to get rid of the context in case
675 * a failure occurs before its contents are completely set up.
676 *
677 * Callers often assume that this function cannot fail, so don't put any
678 * elog(ERROR) calls in it.
679 *
680 * A possible caller error is to reparent a context under itself, creating
681 * a loop in the context graph. We assert here that context != new_parent,
682 * but checking for multi-level loops seems more trouble than it's worth.
683 */
684void
686{
688 Assert(context != new_parent);
689
690 /* Fast path if it's got correct parent already */
691 if (new_parent == context->parent)
692 return;
693
694 /* Delink from existing parent, if any */
695 if (context->parent)
696 {
697 MemoryContext parent = context->parent;
698
699 if (context->prevchild != NULL)
700 context->prevchild->nextchild = context->nextchild;
701 else
702 {
703 Assert(parent->firstchild == context);
704 parent->firstchild = context->nextchild;
705 }
706
707 if (context->nextchild != NULL)
708 context->nextchild->prevchild = context->prevchild;
709 }
710
711 /* And relink */
712 if (new_parent)
713 {
715 context->parent = new_parent;
716 context->prevchild = NULL;
717 context->nextchild = new_parent->firstchild;
718 if (new_parent->firstchild != NULL)
719 new_parent->firstchild->prevchild = context;
720 new_parent->firstchild = context;
721 }
722 else
723 {
724 context->parent = NULL;
725 context->prevchild = NULL;
726 context->nextchild = NULL;
727 }
728}
729
730/*
731 * MemoryContextAllowInCriticalSection
732 * Allow/disallow allocations in this memory context within a critical
733 * section.
734 *
735 * Normally, memory allocations are not allowed within a critical section,
736 * because a failure would lead to PANIC. There are a few exceptions to
737 * that, like allocations related to debugging code that is not supposed to
738 * be enabled in production. This function can be used to exempt specific
739 * memory contexts from the assertion in palloc().
740 */
741void
743{
745
746 context->allowInCritSection = allow;
747}
748
749/*
750 * GetMemoryChunkContext
751 * Given a currently-allocated chunk, determine the MemoryContext that
752 * the chunk belongs to.
753 */
755GetMemoryChunkContext(void *pointer)
756{
757 return MCXT_METHOD(pointer, get_chunk_context) (pointer);
758}
759
760/*
761 * GetMemoryChunkSpace
762 * Given a currently-allocated chunk, determine the total space
763 * it occupies (including all memory-allocation overhead).
764 *
765 * This is useful for measuring the total space occupied by a set of
766 * allocated chunks.
767 */
768Size
769GetMemoryChunkSpace(void *pointer)
770{
771 return MCXT_METHOD(pointer, get_chunk_space) (pointer);
772}
773
774/*
775 * MemoryContextGetParent
776 * Get the parent context (if any) of the specified context
777 */
780{
782
783 return context->parent;
784}
785
786/*
787 * MemoryContextIsEmpty
788 * Is a memory context empty of any allocated space?
789 */
790bool
792{
794
795 /*
796 * For now, we consider a memory context nonempty if it has any children;
797 * perhaps this should be changed later.
798 */
799 if (context->firstchild != NULL)
800 return false;
801 /* Otherwise use the type-specific inquiry */
802 return context->methods->is_empty(context);
803}
804
805/*
806 * Find the memory allocated to blocks for this memory context. If recurse is
807 * true, also include children.
808 */
809Size
810MemoryContextMemAllocated(MemoryContext context, bool recurse)
811{
812 Size total = context->mem_allocated;
813
815
816 if (recurse)
817 {
818 for (MemoryContext curr = context->firstchild;
819 curr != NULL;
821 {
822 total += curr->mem_allocated;
823 }
824 }
825
826 return total;
827}
828
829/*
830 * Return the memory consumption statistics about the given context and its
831 * children.
832 */
833void
836{
838
839 memset(consumed, 0, sizeof(*consumed));
840
841 /* Examine the context itself */
842 context->methods->stats(context, NULL, NULL, consumed, false);
843
844 /* Examine children, using iteration not recursion */
845 for (MemoryContext curr = context->firstchild;
846 curr != NULL;
848 {
849 curr->methods->stats(curr, NULL, NULL, consumed, false);
850 }
851}
852
853/*
854 * MemoryContextStats
855 * Print statistics about the named context and all its descendants.
856 *
857 * This is just a debugging utility, so it's not very fancy. However, we do
858 * make some effort to summarize when the output would otherwise be very long.
859 * The statistics are sent to stderr.
860 */
861void
863{
864 /* Hard-wired limits are usually good enough */
865 MemoryContextStatsDetail(context, 100, 100, true);
866}
867
868/*
869 * MemoryContextStatsDetail
870 *
871 * Entry point for use if you want to vary the number of child contexts shown.
872 *
873 * If print_to_stderr is true, print statistics about the memory contexts
874 * with fprintf(stderr), otherwise use ereport().
875 */
876void
878 int max_level, int max_children,
879 bool print_to_stderr)
880{
882
883 memset(&grand_totals, 0, sizeof(grand_totals));
884
887
888 if (print_to_stderr)
890 "Grand total: %zu bytes in %zu blocks; %zu free (%zu chunks); %zu used\n",
891 grand_totals.totalspace, grand_totals.nblocks,
892 grand_totals.freespace, grand_totals.freechunks,
893 grand_totals.totalspace - grand_totals.freespace);
894 else
895 {
896 /*
897 * Use LOG_SERVER_ONLY to prevent the memory contexts from being sent
898 * to the connected client.
899 *
900 * We don't buffer the information about all memory contexts in a
901 * backend into StringInfo and log it as one message. That would
902 * require the buffer to be enlarged, risking an OOM as there could be
903 * a large number of memory contexts in a backend. Instead, we log
904 * one message per memory context.
905 */
907 (errhidestmt(true),
908 errhidecontext(true),
909 errmsg_internal("Grand total: %zu bytes in %zu blocks; %zu free (%zu chunks); %zu used",
910 grand_totals.totalspace, grand_totals.nblocks,
911 grand_totals.freespace, grand_totals.freechunks,
912 grand_totals.totalspace - grand_totals.freespace)));
913 }
914}
915
916/*
917 * MemoryContextStatsInternal
918 * One recursion level for MemoryContextStats
919 *
920 * Print stats for this context if possible, but in any case accumulate counts
921 * into *totals (if not NULL).
922 */
923static void
925 int max_level, int max_children,
927 bool print_to_stderr)
928{
929 MemoryContext child;
930 int ichild;
931
933
934 /* Examine the context itself */
935 context->methods->stats(context,
937 &level,
939
940 /*
941 * Examine children.
942 *
943 * If we are past the recursion depth limit or already running low on
944 * stack, do not print them explicitly but just summarize them. Similarly,
945 * if there are more than max_children of them, we do not print the rest
946 * explicitly, but just summarize them.
947 */
948 child = context->firstchild;
949 ichild = 0;
950 if (level <= max_level && !stack_is_too_deep())
951 {
952 for (; child != NULL && ichild < max_children;
953 child = child->nextchild, ichild++)
954 {
955 MemoryContextStatsInternal(child, level + 1,
957 totals,
959 }
960 }
961
962 if (child != NULL)
963 {
964 /* Summarize the rest of the children, avoiding recursion. */
966
967 memset(&local_totals, 0, sizeof(local_totals));
968
969 ichild = 0;
970 while (child != NULL)
971 {
972 child->methods->stats(child, NULL, NULL, &local_totals, false);
973 ichild++;
974 child = MemoryContextTraverseNext(child, context);
975 }
976
977 if (print_to_stderr)
978 {
979 for (int i = 0; i < level; i++)
980 fprintf(stderr, " ");
982 "%d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used\n",
983 ichild,
984 local_totals.totalspace,
985 local_totals.nblocks,
986 local_totals.freespace,
987 local_totals.freechunks,
988 local_totals.totalspace - local_totals.freespace);
989 }
990 else
992 (errhidestmt(true),
993 errhidecontext(true),
994 errmsg_internal("level: %d; %d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used",
995 level,
996 ichild,
997 local_totals.totalspace,
998 local_totals.nblocks,
999 local_totals.freespace,
1000 local_totals.freechunks,
1001 local_totals.totalspace - local_totals.freespace)));
1002
1003 if (totals)
1004 {
1005 totals->nblocks += local_totals.nblocks;
1006 totals->freechunks += local_totals.freechunks;
1007 totals->totalspace += local_totals.totalspace;
1008 totals->freespace += local_totals.freespace;
1009 }
1010 }
1011}
1012
1013/*
1014 * MemoryContextStatsPrint
1015 * Print callback used by MemoryContextStatsInternal
1016 *
1017 * For now, the passthru pointer just points to "int level"; later we might
1018 * make that more complicated.
1019 */
1020static void
1022 const char *stats_string,
1023 bool print_to_stderr)
1024{
1025 int level = *(int *) passthru;
1026 const char *name = context->name;
1027 const char *ident = context->ident;
1028 char truncated_ident[110];
1029 int i;
1030
1031 /*
1032 * It seems preferable to label dynahash contexts with just the hash table
1033 * name. Those are already unique enough, so the "dynahash" part isn't
1034 * very helpful, and this way is more consistent with pre-v11 practice.
1035 */
1036 if (ident && strcmp(name, "dynahash") == 0)
1037 {
1038 name = ident;
1039 ident = NULL;
1040 }
1041
1042 truncated_ident[0] = '\0';
1043
1044 if (ident)
1045 {
1046 /*
1047 * Some contexts may have very long identifiers (e.g., SQL queries).
1048 * Arbitrarily truncate at 100 bytes, but be careful not to break
1049 * multibyte characters. Also, replace ASCII control characters, such
1050 * as newlines, with spaces.
1051 */
1052 int idlen = strlen(ident);
1053 bool truncated = false;
1054
1055 strcpy(truncated_ident, ": ");
1057
1058 if (idlen > 100)
1059 {
1060 idlen = pg_mbcliplen(ident, idlen, 100);
1061 truncated = true;
1062 }
1063
1064 while (idlen-- > 0)
1065 {
1066 unsigned char c = *ident++;
1067
1068 if (c < ' ')
1069 c = ' ';
1070 truncated_ident[i++] = c;
1071 }
1072 truncated_ident[i] = '\0';
1073
1074 if (truncated)
1075 strcat(truncated_ident, "...");
1076 }
1077
1078 if (print_to_stderr)
1079 {
1080 for (i = 1; i < level; i++)
1081 fprintf(stderr, " ");
1083 }
1084 else
1086 (errhidestmt(true),
1087 errhidecontext(true),
1088 errmsg_internal("level: %d; %s: %s%s",
1089 level, name, stats_string, truncated_ident)));
1090}
1091
1092/*
1093 * MemoryContextCheck
1094 * Check all chunks in the named context and its children.
1095 *
1096 * This is just a debugging utility, so it's not fancy.
1097 */
1098#ifdef MEMORY_CONTEXT_CHECKING
1099void
1101{
1102 Assert(MemoryContextIsValid(context));
1103 context->methods->check(context);
1104
1105 for (MemoryContext curr = context->firstchild;
1106 curr != NULL;
1108 {
1110 curr->methods->check(curr);
1111 }
1112}
1113#endif
1114
1115/*
1116 * MemoryContextCreate
1117 * Context-type-independent part of context creation.
1118 *
1119 * This is only intended to be called by context-type-specific
1120 * context creation routines, not by the unwashed masses.
1121 *
1122 * The memory context creation procedure goes like this:
1123 * 1. Context-type-specific routine makes some initial space allocation,
1124 * including enough space for the context header. If it fails,
1125 * it can ereport() with no damage done.
1126 * 2. Context-type-specific routine sets up all type-specific fields of
1127 * the header (those beyond MemoryContextData proper), as well as any
1128 * other management fields it needs to have a fully valid context.
1129 * Usually, failure in this step is impossible, but if it's possible
1130 * the initial space allocation should be freed before ereport'ing.
1131 * 3. Context-type-specific routine calls MemoryContextCreate() to fill in
1132 * the generic header fields and link the context into the context tree.
1133 * 4. We return to the context-type-specific routine, which finishes
1134 * up type-specific initialization. This routine can now do things
1135 * that might fail (like allocate more memory), so long as it's
1136 * sure the node is left in a state that delete will handle.
1137 *
1138 * node: the as-yet-uninitialized common part of the context header node.
1139 * tag: NodeTag code identifying the memory context type.
1140 * method_id: MemoryContextMethodID of the context-type being created.
1141 * parent: parent context, or NULL if this will be a top-level context.
1142 * name: name of context (must be statically allocated).
1143 *
1144 * Context routines generally assume that MemoryContextCreate can't fail,
1145 * so this can contain Assert but not elog/ereport.
1146 */
1147void
1149 NodeTag tag,
1151 MemoryContext parent,
1152 const char *name)
1153{
1154 /* Creating new memory contexts is not allowed in a critical section */
1156
1157 /* Validate parent, to help prevent crazy context linkages */
1158 Assert(parent == NULL || MemoryContextIsValid(parent));
1159 Assert(node != parent);
1160
1161 /* Initialize all standard fields of memory context header */
1162 node->type = tag;
1163 node->isReset = true;
1164 node->methods = &mcxt_methods[method_id];
1165 node->parent = parent;
1166 node->firstchild = NULL;
1167 node->mem_allocated = 0;
1168 node->prevchild = NULL;
1169 node->name = name;
1170 node->ident = NULL;
1171 node->reset_cbs = NULL;
1172
1173 /* OK to link node into context tree */
1174 if (parent)
1175 {
1176 node->nextchild = parent->firstchild;
1177 if (parent->firstchild != NULL)
1178 parent->firstchild->prevchild = node;
1179 parent->firstchild = node;
1180 /* inherit allowInCritSection flag from parent */
1181 node->allowInCritSection = parent->allowInCritSection;
1182 }
1183 else
1184 {
1185 node->nextchild = NULL;
1186 node->allowInCritSection = false;
1187 }
1188}
1189
1190/*
1191 * MemoryContextAllocationFailure
1192 * For use by MemoryContextMethods implementations to handle when malloc
1193 * returns NULL. The behavior is specific to whether MCXT_ALLOC_NO_OOM
1194 * is in 'flags'.
1195 */
1196void *
1197MemoryContextAllocationFailure(MemoryContext context, Size size, int flags)
1198{
1199 if ((flags & MCXT_ALLOC_NO_OOM) == 0)
1200 {
1201 if (TopMemoryContext)
1203 ereport(ERROR,
1205 errmsg("out of memory"),
1206 errdetail("Failed on request of size %zu in memory context \"%s\".",
1207 size, context->name)));
1208 }
1209 return NULL;
1210}
1211
1212/*
1213 * MemoryContextSizeFailure
1214 * For use by MemoryContextMethods implementations to handle invalid
1215 * memory allocation request sizes.
1216 */
1217void
1218MemoryContextSizeFailure(MemoryContext context, Size size, int flags)
1219{
1220 elog(ERROR, "invalid memory alloc request size %zu", size);
1221}
1222
1223/*
1224 * MemoryContextAlloc
1225 * Allocate space within the specified context.
1226 *
1227 * This could be turned into a macro, but we'd have to import
1228 * nodes/memnodes.h into postgres.h which seems a bad idea.
1229 */
1230void *
1232{
1233 void *ret;
1234
1235 Assert(MemoryContextIsValid(context));
1237
1238 context->isReset = false;
1239
1240 /*
1241 * For efficiency reasons, we purposefully offload the handling of
1242 * allocation failures to the MemoryContextMethods implementation as this
1243 * allows these checks to be performed only when an actual malloc needs to
1244 * be done to request more memory from the OS. Additionally, not having
1245 * to execute any instructions after this call allows the compiler to use
1246 * the sibling call optimization. If you're considering adding code after
1247 * this call, consider making it the responsibility of the 'alloc'
1248 * function instead.
1249 */
1250 ret = context->methods->alloc(context, size, 0);
1251
1252 VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1253
1254 return ret;
1255}
1256
1257/*
1258 * MemoryContextAllocZero
1259 * Like MemoryContextAlloc, but clears allocated memory
1260 *
1261 * We could just call MemoryContextAlloc then clear the memory, but this
1262 * is a very common combination, so we provide the combined operation.
1263 */
1264void *
1266{
1267 void *ret;
1268
1269 Assert(MemoryContextIsValid(context));
1271
1272 context->isReset = false;
1273
1274 ret = context->methods->alloc(context, size, 0);
1275
1276 VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1277
1278 MemSetAligned(ret, 0, size);
1279
1280 return ret;
1281}
1282
1283/*
1284 * MemoryContextAllocExtended
1285 * Allocate space within the specified context using the given flags.
1286 */
1287void *
1288MemoryContextAllocExtended(MemoryContext context, Size size, int flags)
1289{
1290 void *ret;
1291
1292 Assert(MemoryContextIsValid(context));
1294
1295 if (!((flags & MCXT_ALLOC_HUGE) != 0 ? AllocHugeSizeIsValid(size) :
1296 AllocSizeIsValid(size)))
1297 elog(ERROR, "invalid memory alloc request size %zu", size);
1298
1299 context->isReset = false;
1300
1301 ret = context->methods->alloc(context, size, flags);
1302 if (unlikely(ret == NULL))
1303 return NULL;
1304
1305 VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1306
1307 if ((flags & MCXT_ALLOC_ZERO) != 0)
1308 MemSetAligned(ret, 0, size);
1309
1310 return ret;
1311}
1312
1313/*
1314 * HandleLogMemoryContextInterrupt
1315 * Handle receipt of an interrupt indicating logging of memory
1316 * contexts.
1317 *
1318 * All the actual work is deferred to ProcessLogMemoryContextInterrupt(),
1319 * because we cannot safely emit a log message inside the signal handler.
1320 */
1321void
1323{
1324 InterruptPending = true;
1326 /* latch will be set by procsignal_sigusr1_handler */
1327}
1328
1329/*
1330 * ProcessLogMemoryContextInterrupt
1331 * Perform logging of memory contexts of this backend process.
1332 *
1333 * Any backend that participates in ProcSignal signaling must arrange
1334 * to call this function if we see LogMemoryContextPending set.
1335 * It is called from CHECK_FOR_INTERRUPTS(), which is enough because
1336 * the target process for logging of memory contexts is a backend.
1337 */
1338void
1340{
1342
1343 /*
1344 * Exit immediately if memory context logging is already in progress. This
1345 * prevents recursive calls, which could occur if logging is requested
1346 * repeatedly and rapidly, potentially leading to infinite recursion and a
1347 * crash.
1348 */
1350 return;
1352
1353 PG_TRY();
1354 {
1355 /*
1356 * Use LOG_SERVER_ONLY to prevent this message from being sent to the
1357 * connected client.
1358 */
1360 (errhidestmt(true),
1361 errhidecontext(true),
1362 errmsg("logging memory contexts of PID %d", MyProcPid)));
1363
1364 /*
1365 * When a backend process is consuming huge memory, logging all its
1366 * memory contexts might overrun available disk space. To prevent
1367 * this, we limit the depth of the hierarchy, as well as the number of
1368 * child contexts to log per parent to 100.
1369 *
1370 * As with MemoryContextStats(), we suppose that practical cases where
1371 * the dump gets long will typically be huge numbers of siblings under
1372 * the same parent context; while the additional debugging value from
1373 * seeing details about individual siblings beyond 100 will not be
1374 * large.
1375 */
1377 }
1378 PG_FINALLY();
1379 {
1381 }
1382 PG_END_TRY();
1383}
1384
1385void *
1386palloc(Size size)
1387{
1388 /* duplicates MemoryContextAlloc to avoid increased overhead */
1389 void *ret;
1391
1392 Assert(MemoryContextIsValid(context));
1394
1395 context->isReset = false;
1396
1397 /*
1398 * For efficiency reasons, we purposefully offload the handling of
1399 * allocation failures to the MemoryContextMethods implementation as this
1400 * allows these checks to be performed only when an actual malloc needs to
1401 * be done to request more memory from the OS. Additionally, not having
1402 * to execute any instructions after this call allows the compiler to use
1403 * the sibling call optimization. If you're considering adding code after
1404 * this call, consider making it the responsibility of the 'alloc'
1405 * function instead.
1406 */
1407 ret = context->methods->alloc(context, size, 0);
1408 /* We expect OOM to be handled by the alloc function */
1409 Assert(ret != NULL);
1410 VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1411
1412 return ret;
1413}
1414
1415void *
1416palloc0(Size size)
1417{
1418 /* duplicates MemoryContextAllocZero to avoid increased overhead */
1419 void *ret;
1421
1422 Assert(MemoryContextIsValid(context));
1424
1425 context->isReset = false;
1426
1427 ret = context->methods->alloc(context, size, 0);
1428 /* We expect OOM to be handled by the alloc function */
1429 Assert(ret != NULL);
1430 VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1431
1432 MemSetAligned(ret, 0, size);
1433
1434 return ret;
1435}
1436
1437void *
1438palloc_extended(Size size, int flags)
1439{
1440 /* duplicates MemoryContextAllocExtended to avoid increased overhead */
1441 void *ret;
1443
1444 Assert(MemoryContextIsValid(context));
1446
1447 context->isReset = false;
1448
1449 ret = context->methods->alloc(context, size, flags);
1450 if (unlikely(ret == NULL))
1451 {
1452 /* NULL can be returned only when using MCXT_ALLOC_NO_OOM */
1453 Assert(flags & MCXT_ALLOC_NO_OOM);
1454 return NULL;
1455 }
1456
1457 VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1458
1459 if ((flags & MCXT_ALLOC_ZERO) != 0)
1460 MemSetAligned(ret, 0, size);
1461
1462 return ret;
1463}
1464
1465/*
1466 * MemoryContextAllocAligned
1467 * Allocate 'size' bytes of memory in 'context' aligned to 'alignto'
1468 * bytes.
1469 *
1470 * Currently, we align addresses by requesting additional bytes from the
1471 * MemoryContext's standard allocator function and then aligning the returned
1472 * address by the required alignment. This means that the given MemoryContext
1473 * must support providing us with a chunk of memory that's larger than 'size'.
1474 * For allocators such as Slab, that's not going to work, as slab only allows
1475 * chunks of the size that's specified when the context is created.
1476 *
1477 * 'alignto' must be a power of 2.
1478 * 'flags' may be 0 or set the same as MemoryContextAllocExtended().
1479 */
1480void *
1482 Size size, Size alignto, int flags)
1483{
1486 void *unaligned;
1487 void *aligned;
1488
1489 /*
1490 * Restrict alignto to ensure that it can fit into the "value" field of
1491 * the redirection MemoryChunk, and that the distance back to the start of
1492 * the unaligned chunk will fit into the space available for that. This
1493 * isn't a limitation in practice, since it wouldn't make much sense to
1494 * waste that much space.
1495 */
1496 Assert(alignto < (128 * 1024 * 1024));
1497
1498 /* ensure alignto is a power of 2 */
1499 Assert((alignto & (alignto - 1)) == 0);
1500
1501 /*
1502 * If the alignment requirements are less than what we already guarantee
1503 * then just use the standard allocation function.
1504 */
1506 return MemoryContextAllocExtended(context, size, flags);
1507
1508 /*
1509 * We implement aligned pointers by simply allocating enough memory for
1510 * the requested size plus the alignment and an additional "redirection"
1511 * MemoryChunk. This additional MemoryChunk is required for operations
1512 * such as pfree when used on the pointer returned by this function. We
1513 * use this redirection MemoryChunk in order to find the pointer to the
1514 * memory that was returned by the MemoryContextAllocExtended call below.
1515 * We do that by "borrowing" the block offset field and instead of using
1516 * that to find the offset into the owning block, we use it to find the
1517 * original allocated address.
1518 *
1519 * Here we must allocate enough extra memory so that we can still align
1520 * the pointer returned by MemoryContextAllocExtended and also have enough
1521 * space for the redirection MemoryChunk. Since allocations will already
1522 * be at least aligned by MAXIMUM_ALIGNOF, we can subtract that amount
1523 * from the allocation size to save a little memory.
1524 */
1526
1527#ifdef MEMORY_CONTEXT_CHECKING
1528 /* ensure there's space for a sentinel byte */
1529 alloc_size += 1;
1530#endif
1531
1532 /*
1533 * Perform the actual allocation, but do not pass down MCXT_ALLOC_ZERO.
1534 * This ensures that wasted bytes beyond the aligned chunk do not become
1535 * DEFINED.
1536 */
1538 flags & ~MCXT_ALLOC_ZERO);
1539
1540 /* compute the aligned pointer */
1541 aligned = (void *) TYPEALIGN(alignto, (char *) unaligned +
1542 sizeof(MemoryChunk));
1543
1545
1546 /*
1547 * We set the redirect MemoryChunk so that the block offset calculation is
1548 * used to point back to the 'unaligned' allocated chunk. This allows us
1549 * to use MemoryChunkGetBlock() to find the unaligned chunk when we need
1550 * to perform operations such as pfree() and repalloc().
1551 *
1552 * We store 'alignto' in the MemoryChunk's 'value' so that we know what
1553 * the alignment was set to should we ever be asked to realloc this
1554 * pointer.
1555 */
1558
1559 /* double check we produced a correctly aligned pointer */
1560 Assert((void *) TYPEALIGN(alignto, aligned) == aligned);
1561
1562#ifdef MEMORY_CONTEXT_CHECKING
1563 alignedchunk->requested_size = size;
1564 /* set mark to catch clobber of "unused" space */
1565 set_sentinel(aligned, size);
1566#endif
1567
1568 /*
1569 * MemoryContextAllocExtended marked the whole unaligned chunk as a
1570 * vchunk. Undo that, instead making just the aligned chunk be a vchunk.
1571 * This prevents Valgrind from complaining that the vchunk is possibly
1572 * leaked, since only pointers to the aligned chunk will exist.
1573 *
1574 * After these calls, the aligned chunk will be marked UNDEFINED, and all
1575 * the rest of the unaligned chunk (the redirection chunk header, the
1576 * padding bytes before it, and any wasted trailing bytes) will be marked
1577 * NOACCESS, which is what we want.
1578 */
1580 VALGRIND_MEMPOOL_ALLOC(context, aligned, size);
1581
1582 /* Now zero (and make DEFINED) just the aligned chunk, if requested */
1583 if ((flags & MCXT_ALLOC_ZERO) != 0)
1584 MemSetAligned(aligned, 0, size);
1585
1586 return aligned;
1587}
1588
1589/*
1590 * palloc_aligned
1591 * Allocate 'size' bytes returning a pointer that's aligned to the
1592 * 'alignto' boundary.
1593 *
1594 * Currently, we align addresses by requesting additional bytes from the
1595 * MemoryContext's standard allocator function and then aligning the returned
1596 * address by the required alignment. This means that the given MemoryContext
1597 * must support providing us with a chunk of memory that's larger than 'size'.
1598 * For allocators such as Slab, that's not going to work, as slab only allows
1599 * chunks of the size that's specified when the context is created.
1600 *
1601 * 'alignto' must be a power of 2.
1602 * 'flags' may be 0 or set the same as MemoryContextAllocExtended().
1603 */
1604void *
1605palloc_aligned(Size size, Size alignto, int flags)
1606{
1608}
1609
1610/*
1611 * pfree
1612 * Release an allocated chunk.
1613 */
1614void
1615pfree(void *pointer)
1616{
1617#ifdef USE_VALGRIND
1618 MemoryContext context = GetMemoryChunkContext(pointer);
1619#endif
1620
1621 MCXT_METHOD(pointer, free_p) (pointer);
1622
1623 VALGRIND_MEMPOOL_FREE(context, pointer);
1624}
1625
1626/*
1627 * repalloc
1628 * Adjust the size of a previously allocated chunk.
1629 */
1630void *
1631repalloc(void *pointer, Size size)
1632{
1633#if defined(USE_ASSERT_CHECKING) || defined(USE_VALGRIND)
1634 MemoryContext context = GetMemoryChunkContext(pointer);
1635#endif
1636 void *ret;
1637
1639
1640 /* isReset must be false already */
1641 Assert(!context->isReset);
1642
1643 /*
1644 * For efficiency reasons, we purposefully offload the handling of
1645 * allocation failures to the MemoryContextMethods implementation as this
1646 * allows these checks to be performed only when an actual malloc needs to
1647 * be done to request more memory from the OS. Additionally, not having
1648 * to execute any instructions after this call allows the compiler to use
1649 * the sibling call optimization. If you're considering adding code after
1650 * this call, consider making it the responsibility of the 'realloc'
1651 * function instead.
1652 */
1653 ret = MCXT_METHOD(pointer, realloc) (pointer, size, 0);
1654
1655 VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size);
1656
1657 return ret;
1658}
1659
1660/*
1661 * repalloc_extended
1662 * Adjust the size of a previously allocated chunk,
1663 * with HUGE and NO_OOM options.
1664 */
1665void *
1666repalloc_extended(void *pointer, Size size, int flags)
1667{
1668#if defined(USE_ASSERT_CHECKING) || defined(USE_VALGRIND)
1669 MemoryContext context = GetMemoryChunkContext(pointer);
1670#endif
1671 void *ret;
1672
1674
1675 /* isReset must be false already */
1676 Assert(!context->isReset);
1677
1678 /*
1679 * For efficiency reasons, we purposefully offload the handling of
1680 * allocation failures to the MemoryContextMethods implementation as this
1681 * allows these checks to be performed only when an actual malloc needs to
1682 * be done to request more memory from the OS. Additionally, not having
1683 * to execute any instructions after this call allows the compiler to use
1684 * the sibling call optimization. If you're considering adding code after
1685 * this call, consider making it the responsibility of the 'realloc'
1686 * function instead.
1687 */
1688 ret = MCXT_METHOD(pointer, realloc) (pointer, size, flags);
1689 if (unlikely(ret == NULL))
1690 return NULL;
1691
1692 VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size);
1693
1694 return ret;
1695}
1696
1697/*
1698 * repalloc0
1699 * Adjust the size of a previously allocated chunk and zero out the added
1700 * space.
1701 */
1702void *
1703repalloc0(void *pointer, Size oldsize, Size size)
1704{
1705 void *ret;
1706
1707 /* catch wrong argument order */
1708 if (unlikely(oldsize > size))
1709 elog(ERROR, "invalid repalloc0 call: oldsize %zu, new size %zu",
1710 oldsize, size);
1711
1712 ret = repalloc(pointer, size);
1713 memset((char *) ret + oldsize, 0, (size - oldsize));
1714 return ret;
1715}
1716
1717/*
1718 * MemoryContextAllocHuge
1719 * Allocate (possibly-expansive) space within the specified context.
1720 *
1721 * See considerations in comment at MaxAllocHugeSize.
1722 */
1723void *
1725{
1726 void *ret;
1727
1728 Assert(MemoryContextIsValid(context));
1730
1731 context->isReset = false;
1732
1733 /*
1734 * For efficiency reasons, we purposefully offload the handling of
1735 * allocation failures to the MemoryContextMethods implementation as this
1736 * allows these checks to be performed only when an actual malloc needs to
1737 * be done to request more memory from the OS. Additionally, not having
1738 * to execute any instructions after this call allows the compiler to use
1739 * the sibling call optimization. If you're considering adding code after
1740 * this call, consider making it the responsibility of the 'alloc'
1741 * function instead.
1742 */
1743 ret = context->methods->alloc(context, size, MCXT_ALLOC_HUGE);
1744
1745 VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1746
1747 return ret;
1748}
1749
1750/*
1751 * repalloc_huge
1752 * Adjust the size of a previously allocated chunk, permitting a large
1753 * value. The previous allocation need not have been "huge".
1754 */
1755void *
1756repalloc_huge(void *pointer, Size size)
1757{
1758 /* this one seems not worth its own implementation */
1759 return repalloc_extended(pointer, size, MCXT_ALLOC_HUGE);
1760}
1761
1762/*
1763 * MemoryContextStrdup
1764 * Like strdup(), but allocate from the specified context
1765 */
1766char *
1767MemoryContextStrdup(MemoryContext context, const char *string)
1768{
1769 char *nstr;
1770 Size len = strlen(string) + 1;
1771
1772 nstr = (char *) MemoryContextAlloc(context, len);
1773
1774 memcpy(nstr, string, len);
1775
1776 return nstr;
1777}
1778
1779char *
1780pstrdup(const char *in)
1781{
1783}
1784
1785/*
1786 * pnstrdup
1787 * Like pstrdup(), but append null byte to a
1788 * not-necessarily-null-terminated input string.
1789 */
1790char *
1791pnstrdup(const char *in, Size len)
1792{
1793 char *out;
1794
1795 len = strnlen(in, len);
1796
1797 out = palloc(len + 1);
1798 memcpy(out, in, len);
1799 out[len] = '\0';
1800
1801 return out;
1802}
1803
1804/*
1805 * Make copy of string with all trailing newline characters removed.
1806 */
1807char *
1808pchomp(const char *in)
1809{
1810 size_t n;
1811
1812 n = strlen(in);
1813 while (n > 0 && in[n - 1] == '\n')
1814 n--;
1815 return pnstrdup(in, n);
1816}
#define MAXALIGN(LEN)
Definition c.h:826
#define TYPEALIGN(ALIGNVAL, LEN)
Definition c.h:819
#define Assert(condition)
Definition c.h:873
#define MemSetAligned(start, val, len)
Definition c.h:1043
uint64_t uint64
Definition c.h:547
#define unlikely(x)
Definition c.h:412
size_t Size
Definition c.h:619
#define fprintf(file, fmt, msg)
Definition cubescan.l:21
struct cursor * cur
Definition ecpg.c:29
int errmsg_internal(const char *fmt,...)
Definition elog.c:1170
int errhidestmt(bool hide_stmt)
Definition elog.c:1445
int errdetail(const char *fmt,...)
Definition elog.c:1216
int errhidecontext(bool hide_ctx)
Definition elog.c:1464
int errcode(int sqlerrcode)
Definition elog.c:863
int errmsg(const char *fmt,...)
Definition elog.c:1080
#define LOG_SERVER_ONLY
Definition elog.h:32
#define PG_TRY(...)
Definition elog.h:372
#define PG_END_TRY(...)
Definition elog.h:397
#define ERROR
Definition elog.h:39
#define elog(elevel,...)
Definition elog.h:226
#define PG_FINALLY(...)
Definition elog.h:389
#define ereport(elevel,...)
Definition elog.h:150
#define MCXT_ALLOC_ZERO
Definition fe_memutils.h:30
#define MCXT_ALLOC_HUGE
Definition fe_memutils.h:28
#define MCXT_ALLOC_NO_OOM
Definition fe_memutils.h:29
volatile sig_atomic_t LogMemoryContextPending
Definition globals.c:41
volatile sig_atomic_t InterruptPending
Definition globals.c:32
int MyProcPid
Definition globals.c:47
volatile uint32 CritSectionCount
Definition globals.c:45
#define ident
int i
Definition isn.c:77
int pg_mbcliplen(const char *mbstr, int len, int limit)
Definition mbutils.c:1086
static void MemoryContextStatsInternal(MemoryContext context, int level, int max_level, int max_children, MemoryContextCounters *totals, bool print_to_stderr)
Definition mcxt.c:925
void MemoryContextUnregisterResetCallback(MemoryContext context, MemoryContextCallback *cb)
Definition mcxt.c:607
void * repalloc0(void *pointer, Size oldsize, Size size)
Definition mcxt.c:1704
static void MemoryContextCallResetCallbacks(MemoryContext context)
Definition mcxt.c:634
char * MemoryContextStrdup(MemoryContext context, const char *string)
Definition mcxt.c:1768
void * MemoryContextAlloc(MemoryContext context, Size size)
Definition mcxt.c:1232
bool MemoryContextIsEmpty(MemoryContext context)
Definition mcxt.c:792
void MemoryContextMemConsumed(MemoryContext context, MemoryContextCounters *consumed)
Definition mcxt.c:835
void MemoryContextReset(MemoryContext context)
Definition mcxt.c:403
void MemoryContextCreate(MemoryContext node, NodeTag tag, MemoryContextMethodID method_id, MemoryContext parent, const char *name)
Definition mcxt.c:1149
void * MemoryContextAllocZero(MemoryContext context, Size size)
Definition mcxt.c:1266
char * pstrdup(const char *in)
Definition mcxt.c:1781
void HandleLogMemoryContextInterrupt(void)
Definition mcxt.c:1323
void MemoryContextRegisterResetCallback(MemoryContext context, MemoryContextCallback *cb)
Definition mcxt.c:582
void MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
Definition mcxt.c:686
static void * BogusRealloc(void *pointer, Size size, int flags)
Definition mcxt.c:313
void * repalloc(void *pointer, Size size)
Definition mcxt.c:1632
void pfree(void *pointer)
Definition mcxt.c:1616
Size GetMemoryChunkSpace(void *pointer)
Definition mcxt.c:770
void * palloc0(Size size)
Definition mcxt.c:1417
static Size BogusGetChunkSpace(void *pointer)
Definition mcxt.c:329
void * MemoryContextAllocAligned(MemoryContext context, Size size, Size alignto, int flags)
Definition mcxt.c:1482
void MemoryContextDeleteChildren(MemoryContext context)
Definition mcxt.c:555
MemoryContext TopMemoryContext
Definition mcxt.c:166
char * pchomp(const char *in)
Definition mcxt.c:1809
#define AssertNotInCriticalSection(context)
Definition mcxt.c:195
void * palloc(Size size)
Definition mcxt.c:1387
MemoryContext CurrentMemoryContext
Definition mcxt.c:160
static MemoryContext MemoryContextTraverseNext(MemoryContext curr, MemoryContext top)
Definition mcxt.c:277
static bool LogMemoryContextInProgress
Definition mcxt.c:178
MemoryContext GetMemoryChunkContext(void *pointer)
Definition mcxt.c:756
void * MemoryContextAllocExtended(MemoryContext context, Size size, int flags)
Definition mcxt.c:1289
void MemoryContextStatsDetail(MemoryContext context, int max_level, int max_children, bool print_to_stderr)
Definition mcxt.c:878
Size MemoryContextMemAllocated(MemoryContext context, bool recurse)
Definition mcxt.c:811
char * pnstrdup(const char *in, Size len)
Definition mcxt.c:1792
void MemoryContextStats(MemoryContext context)
Definition mcxt.c:863
void MemoryContextInit(void)
Definition mcxt.c:359
static void BogusFree(void *pointer)
Definition mcxt.c:306
void * palloc_extended(Size size, int flags)
Definition mcxt.c:1439
void * MemoryContextAllocationFailure(MemoryContext context, Size size, int flags)
Definition mcxt.c:1198
static const MemoryContextMethods mcxt_methods[]
Definition mcxt.c:63
void * repalloc_extended(void *pointer, Size size, int flags)
Definition mcxt.c:1667
MemoryContext MemoryContextGetParent(MemoryContext context)
Definition mcxt.c:780
void ProcessLogMemoryContextInterrupt(void)
Definition mcxt.c:1340
MemoryContext ErrorContext
Definition mcxt.c:167
static MemoryContext BogusGetChunkContext(void *pointer)
Definition mcxt.c:321
void MemoryContextSizeFailure(MemoryContext context, Size size, int flags)
Definition mcxt.c:1219
void * MemoryContextAllocHuge(MemoryContext context, Size size)
Definition mcxt.c:1725
void MemoryContextDelete(MemoryContext context)
Definition mcxt.c:472
void MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
Definition mcxt.c:743
static void MemoryContextDeleteOnly(MemoryContext context)
Definition mcxt.c:514
void MemoryContextResetChildren(MemoryContext context)
Definition mcxt.c:451
static void MemoryContextStatsPrint(MemoryContext context, void *passthru, const char *stats_string, bool print_to_stderr)
Definition mcxt.c:1022
void * repalloc_huge(void *pointer, Size size)
Definition mcxt.c:1757
void MemoryContextSetIdentifier(MemoryContext context, const char *id)
Definition mcxt.c:661
void MemoryContextResetOnly(MemoryContext context)
Definition mcxt.c:422
static uint64 GetMemoryChunkHeader(const void *pointer)
Definition mcxt.c:240
void * palloc_aligned(Size size, Size alignto, int flags)
Definition mcxt.c:1606
#define MCXT_METHOD(pointer, method)
Definition mcxt.c:202
#define VALGRIND_MAKE_MEM_DEFINED(addr, size)
Definition memdebug.h:26
#define VALGRIND_MEMPOOL_CHANGE(context, optr, nptr, size)
Definition memdebug.h:31
#define VALGRIND_MEMPOOL_ALLOC(context, addr, size)
Definition memdebug.h:29
#define VALGRIND_MEMPOOL_FREE(context, addr)
Definition memdebug.h:30
#define VALGRIND_MAKE_MEM_NOACCESS(addr, size)
Definition memdebug.h:27
#define MemoryContextIsValid(context)
Definition memnodes.h:145
#define AllocSetContextCreate
Definition memutils.h:129
#define ALLOCSET_DEFAULT_SIZES
Definition memutils.h:160
#define AllocHugeSizeIsValid(size)
Definition memutils.h:49
#define AllocSizeIsValid(size)
Definition memutils.h:42
#define MEMORY_CONTEXT_METHODID_MASK
#define PallocAlignedExtraBytes(alignto)
MemoryContextMethodID
@ MCTX_ALIGNED_REDIRECT_ID
#define PointerGetMemoryChunk(p)
static void MemoryChunkSetHdrMask(MemoryChunk *chunk, void *block, Size value, MemoryContextMethodID methodid)
NodeTag
Definition nodes.h:27
const void size_t len
char * c
static int fb(int x)
#define realloc(a, b)
bool stack_is_too_deep(void)
struct MemoryContextCallback * next
Definition palloc.h:51
MemoryContextCallbackFunction func
Definition palloc.h:49
MemoryContext prevchild
Definition memnodes.h:129
MemoryContext firstchild
Definition memnodes.h:128
bool allowInCritSection
Definition memnodes.h:124
const char * ident
Definition memnodes.h:132
MemoryContext parent
Definition memnodes.h:127
MemoryContextCallback * reset_cbs
Definition memnodes.h:133
const MemoryContextMethods * methods
Definition memnodes.h:126
MemoryContext nextchild
Definition memnodes.h:130
const char * name
Definition memnodes.h:131
void(* delete_context)(MemoryContext context)
Definition memnodes.h:86
void(* stats)(MemoryContext context, MemoryStatsPrintFunc printfunc, void *passthru, MemoryContextCounters *totals, bool print_to_stderr)
Definition memnodes.h:102
bool(* is_empty)(MemoryContext context)
Definition memnodes.h:101
void *(* alloc)(MemoryContext context, Size size, int flags)
Definition memnodes.h:66
void(* reset)(MemoryContext context)
Definition memnodes.h:83
struct cursor * next
Definition type.h:148
const char * name

◆ BOGUS_MCTX

#define BOGUS_MCTX (   id)
Value:
[id].free_p = BogusFree, \
[id].realloc = BogusRealloc, \
[id].get_chunk_context = BogusGetChunkContext, \
[id].get_chunk_space = BogusGetChunkSpace

Definition at line 57 of file mcxt.c.

◆ MCXT_METHOD

#define MCXT_METHOD (   pointer,
  method 
)     mcxt_methods[GetMemoryChunkMethodID(pointer)].method

Definition at line 202 of file mcxt.c.

Function Documentation

◆ BogusFree()

static void BogusFree ( void pointer)
static

Definition at line 306 of file mcxt.c.

307{
308 elog(ERROR, "pfree called with invalid pointer %p (header 0x%016" PRIx64 ")",
309 pointer, GetMemoryChunkHeader(pointer));
310}

References elog, ERROR, fb(), and GetMemoryChunkHeader().

◆ BogusGetChunkContext()

static MemoryContext BogusGetChunkContext ( void pointer)
static

Definition at line 321 of file mcxt.c.

322{
323 elog(ERROR, "GetMemoryChunkContext called with invalid pointer %p (header 0x%016" PRIx64 ")",
324 pointer, GetMemoryChunkHeader(pointer));
325 return NULL; /* keep compiler quiet */
326}

References elog, ERROR, fb(), and GetMemoryChunkHeader().

◆ BogusGetChunkSpace()

static Size BogusGetChunkSpace ( void pointer)
static

Definition at line 329 of file mcxt.c.

330{
331 elog(ERROR, "GetMemoryChunkSpace called with invalid pointer %p (header 0x%016" PRIx64 ")",
332 pointer, GetMemoryChunkHeader(pointer));
333 return 0; /* keep compiler quiet */
334}

References elog, ERROR, fb(), and GetMemoryChunkHeader().

◆ BogusRealloc()

static void * BogusRealloc ( void pointer,
Size  size,
int  flags 
)
static

Definition at line 313 of file mcxt.c.

314{
315 elog(ERROR, "repalloc called with invalid pointer %p (header 0x%016" PRIx64 ")",
316 pointer, GetMemoryChunkHeader(pointer));
317 return NULL; /* keep compiler quiet */
318}

References elog, ERROR, fb(), and GetMemoryChunkHeader().

◆ GetMemoryChunkContext()

◆ GetMemoryChunkHeader()

static uint64 GetMemoryChunkHeader ( const void pointer)
inlinestatic

Definition at line 240 of file mcxt.c.

241{
242 uint64 header;
243
244 /* Allow access to the uint64 header */
245 VALGRIND_MAKE_MEM_DEFINED((char *) pointer - sizeof(uint64), sizeof(uint64));
246
247 header = *((const uint64 *) ((const char *) pointer - sizeof(uint64)));
248
249 /* Disallow access to the uint64 header */
250 VALGRIND_MAKE_MEM_NOACCESS((char *) pointer - sizeof(uint64), sizeof(uint64));
251
252 return header;
253}

References VALGRIND_MAKE_MEM_DEFINED, and VALGRIND_MAKE_MEM_NOACCESS.

Referenced by BogusFree(), BogusGetChunkContext(), BogusGetChunkSpace(), and BogusRealloc().

◆ GetMemoryChunkMethodID()

static MemoryContextMethodID GetMemoryChunkMethodID ( const void pointer)
inlinestatic

Definition at line 211 of file mcxt.c.

212{
213 uint64 header;
214
215 /*
216 * Try to detect bogus pointers handed to us, poorly though we can.
217 * Presumably, a pointer that isn't MAXALIGNED isn't pointing at an
218 * allocated chunk.
219 */
220 Assert(pointer == (const void *) MAXALIGN(pointer));
221
222 /* Allow access to the uint64 header */
223 VALGRIND_MAKE_MEM_DEFINED((char *) pointer - sizeof(uint64), sizeof(uint64));
224
225 header = *((const uint64 *) ((const char *) pointer - sizeof(uint64)));
226
227 /* Disallow access to the uint64 header */
228 VALGRIND_MAKE_MEM_NOACCESS((char *) pointer - sizeof(uint64), sizeof(uint64));
229
231}

References Assert, MAXALIGN, MEMORY_CONTEXT_METHODID_MASK, VALGRIND_MAKE_MEM_DEFINED, and VALGRIND_MAKE_MEM_NOACCESS.

◆ GetMemoryChunkSpace()

◆ HandleLogMemoryContextInterrupt()

void HandleLogMemoryContextInterrupt ( void  )

Definition at line 1323 of file mcxt.c.

1324{
1325 InterruptPending = true;
1327 /* latch will be set by procsignal_sigusr1_handler */
1328}

References InterruptPending, and LogMemoryContextPending.

Referenced by procsignal_sigusr1_handler().

◆ MemoryContextAlloc()

void * MemoryContextAlloc ( MemoryContext  context,
Size  size 
)

Definition at line 1232 of file mcxt.c.

1233{
1234 void *ret;
1235
1236 Assert(MemoryContextIsValid(context));
1238
1239 context->isReset = false;
1240
1241 /*
1242 * For efficiency reasons, we purposefully offload the handling of
1243 * allocation failures to the MemoryContextMethods implementation as this
1244 * allows these checks to be performed only when an actual malloc needs to
1245 * be done to request more memory from the OS. Additionally, not having
1246 * to execute any instructions after this call allows the compiler to use
1247 * the sibling call optimization. If you're considering adding code after
1248 * this call, consider making it the responsibility of the 'alloc'
1249 * function instead.
1250 */
1251 ret = context->methods->alloc(context, size, 0);
1252
1253 VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1254
1255 return ret;
1256}

References MemoryContextMethods::alloc, Assert, AssertNotInCriticalSection, MemoryContextData::isReset, MemoryContextIsValid, MemoryContextData::methods, and VALGRIND_MEMPOOL_ALLOC.

Referenced by _bt_getroot(), _bt_getrootheight(), _bt_metaversion(), _bt_preprocess_keys(), _fdvec_resize(), _hash_getcachedmetap(), AddInvalidationMessage(), afterTriggerAddEvent(), AfterTriggerBeginSubXact(), AfterTriggerEnlargeQueryState(), allocate_record_info(), array_agg_deserialize(), array_agg_serialize(), array_fill_internal(), array_in(), array_out(), array_position_common(), array_positions(), array_recv(), array_send(), array_to_text_internal(), Async_Notify(), AtSubCommit_childXids(), BackgroundWorkerMain(), be_tls_open_server(), bt_check_level_from_leftmost(), build_concat_foutcache(), build_dummy_expanded_header(), check_foreign_key(), check_primary_key(), compute_array_stats(), copy_byval_expanded_array(), copyScalarSubstructure(), CopySnapshot(), create_drop_transactional_internal(), dblink_init(), deconstruct_expanded_record(), dense_alloc(), domain_state_setup(), dsm_create_descriptor(), dsm_impl_sysv(), enlarge_list(), EventTriggerBeginCompleteQuery(), ExecHashBuildSkewHash(), ExecHashSkewTableInsert(), ExecParallelRetrieveJitInstrumentation(), ExecSetSlotDescriptor(), expand_array(), fetch_array_arg_replace_nulls(), gbt_enum_sortsupport(), get_attribute_options(), get_multirange_io_data(), get_range_io_data(), get_tablespace(), GetComboCommandId(), GetExplainExtensionId(), GetFdwRoutineForRelation(), GetLockConflicts(), GetPlannerExtensionId(), gtrgm_consistent(), gtrgm_distance(), gtrgm_penalty(), hash_create(), hash_record(), hash_record_extended(), hstore_from_record(), hstore_populate_record(), init_execution_state(), initArrayResultAny(), initArrayResultWithSize(), initBloomState(), initialize_reloptions(), InitializeClientEncoding(), InitializeParallelDSM(), InitPgFdwOptions(), InitXLogInsert(), insertStatEntry(), intset_new_internal_node(), intset_new_leaf_node(), inv_open(), libpqsrv_PGresultSetParent(), list_delete_first_n(), list_delete_nth_cell(), llvm_compile_module(), load_domaintype_info(), load_relcache_init_file(), LockAcquireExtended(), logical_rewrite_log_mapping(), lookup_ts_config_cache(), lookup_type_cache(), make_expanded_record_from_exprecord(), make_expanded_record_from_tupdesc(), make_expanded_record_from_typeid(), makeBoolAggState(), MemoryContextStrdup(), mergeruns(), mXactCachePut(), on_dsm_detach(), packGraph(), pg_column_compression(), pg_column_size(), pg_column_toast_chunk_id(), pg_input_is_valid_common(), pg_snapshot_xip(), pg_stat_get_backend_idset(), pgstat_build_snapshot(), pgstat_fetch_entry(), pgstat_get_entry_ref_cached(), pgstat_get_xact_stack_level(), pgstat_init_snapshot_fixed(), pgstat_read_current_status(), plpgsql_create_econtext(), plpgsql_start_datums(), PLy_push_execution_context(), PLy_subtransaction_enter(), PortalSetResultFormat(), pq_init(), PreCommit_Notify(), PrepareClientEncoding(), PrepareSortSupportComparisonShim(), PrepareTempTablespaces(), PushActiveSnapshotWithLevel(), pushJsonbValueScalar(), pushState(), px_find_digest(), queue_listen(), record_cmp(), record_eq(), record_image_cmp(), record_image_eq(), record_in(), record_out(), record_recv(), record_send(), RegisterExprContextCallback(), RegisterExtensionExplainOption(), RegisterResourceReleaseCallback(), RegisterSubXactCallback(), RegisterXactCallback(), RelationBuildRuleLock(), RelationCacheInitialize(), RelationCreateStorage(), RelationDropStorage(), RelationParseRelOptions(), ReorderBufferAllocate(), ReorderBufferAllocChange(), ReorderBufferAllocRelids(), ReorderBufferAllocTupleBuf(), ReorderBufferAllocTXN(), ReorderBufferRestoreChange(), ReorderBufferSerializeReserve(), RequestNamedLWLockTranche(), RestoreSnapshot(), RT_ALLOC_LEAF(), RT_ALLOC_NODE(), setup_background_workers(), shm_mq_receive(), SnapBuildPurgeOlderTxn(), SPI_connect_ext(), SPI_palloc(), sql_compile_callback(), StoreIndexTuple(), sts_read_tuple(), tbm_begin_private_iterate(), test_enc_conversion(), tstoreStartupReceiver(), tts_virtual_materialize(), tuplesort_readtup_alloc(), and xactGetCommittedInvalidationMessages().

◆ MemoryContextAllocAligned()

void * MemoryContextAllocAligned ( MemoryContext  context,
Size  size,
Size  alignto,
int  flags 
)

Definition at line 1482 of file mcxt.c.

1484{
1487 void *unaligned;
1488 void *aligned;
1489
1490 /*
1491 * Restrict alignto to ensure that it can fit into the "value" field of
1492 * the redirection MemoryChunk, and that the distance back to the start of
1493 * the unaligned chunk will fit into the space available for that. This
1494 * isn't a limitation in practice, since it wouldn't make much sense to
1495 * waste that much space.
1496 */
1497 Assert(alignto < (128 * 1024 * 1024));
1498
1499 /* ensure alignto is a power of 2 */
1500 Assert((alignto & (alignto - 1)) == 0);
1501
1502 /*
1503 * If the alignment requirements are less than what we already guarantee
1504 * then just use the standard allocation function.
1505 */
1507 return MemoryContextAllocExtended(context, size, flags);
1508
1509 /*
1510 * We implement aligned pointers by simply allocating enough memory for
1511 * the requested size plus the alignment and an additional "redirection"
1512 * MemoryChunk. This additional MemoryChunk is required for operations
1513 * such as pfree when used on the pointer returned by this function. We
1514 * use this redirection MemoryChunk in order to find the pointer to the
1515 * memory that was returned by the MemoryContextAllocExtended call below.
1516 * We do that by "borrowing" the block offset field and instead of using
1517 * that to find the offset into the owning block, we use it to find the
1518 * original allocated address.
1519 *
1520 * Here we must allocate enough extra memory so that we can still align
1521 * the pointer returned by MemoryContextAllocExtended and also have enough
1522 * space for the redirection MemoryChunk. Since allocations will already
1523 * be at least aligned by MAXIMUM_ALIGNOF, we can subtract that amount
1524 * from the allocation size to save a little memory.
1525 */
1527
1528#ifdef MEMORY_CONTEXT_CHECKING
1529 /* ensure there's space for a sentinel byte */
1530 alloc_size += 1;
1531#endif
1532
1533 /*
1534 * Perform the actual allocation, but do not pass down MCXT_ALLOC_ZERO.
1535 * This ensures that wasted bytes beyond the aligned chunk do not become
1536 * DEFINED.
1537 */
1539 flags & ~MCXT_ALLOC_ZERO);
1540
1541 /* compute the aligned pointer */
1542 aligned = (void *) TYPEALIGN(alignto, (char *) unaligned +
1543 sizeof(MemoryChunk));
1544
1546
1547 /*
1548 * We set the redirect MemoryChunk so that the block offset calculation is
1549 * used to point back to the 'unaligned' allocated chunk. This allows us
1550 * to use MemoryChunkGetBlock() to find the unaligned chunk when we need
1551 * to perform operations such as pfree() and repalloc().
1552 *
1553 * We store 'alignto' in the MemoryChunk's 'value' so that we know what
1554 * the alignment was set to should we ever be asked to realloc this
1555 * pointer.
1556 */
1559
1560 /* double check we produced a correctly aligned pointer */
1561 Assert((void *) TYPEALIGN(alignto, aligned) == aligned);
1562
1563#ifdef MEMORY_CONTEXT_CHECKING
1564 alignedchunk->requested_size = size;
1565 /* set mark to catch clobber of "unused" space */
1566 set_sentinel(aligned, size);
1567#endif
1568
1569 /*
1570 * MemoryContextAllocExtended marked the whole unaligned chunk as a
1571 * vchunk. Undo that, instead making just the aligned chunk be a vchunk.
1572 * This prevents Valgrind from complaining that the vchunk is possibly
1573 * leaked, since only pointers to the aligned chunk will exist.
1574 *
1575 * After these calls, the aligned chunk will be marked UNDEFINED, and all
1576 * the rest of the unaligned chunk (the redirection chunk header, the
1577 * padding bytes before it, and any wasted trailing bytes) will be marked
1578 * NOACCESS, which is what we want.
1579 */
1581 VALGRIND_MEMPOOL_ALLOC(context, aligned, size);
1582
1583 /* Now zero (and make DEFINED) just the aligned chunk, if requested */
1584 if ((flags & MCXT_ALLOC_ZERO) != 0)
1585 MemSetAligned(aligned, 0, size);
1586
1587 return aligned;
1588}

References Assert, fb(), MCTX_ALIGNED_REDIRECT_ID, MCXT_ALLOC_ZERO, MemoryChunkSetHdrMask(), MemoryContextAllocExtended(), MemSetAligned, PallocAlignedExtraBytes, PointerGetMemoryChunk, TYPEALIGN, unlikely, VALGRIND_MEMPOOL_ALLOC, and VALGRIND_MEMPOOL_FREE.

Referenced by AlignedAllocRealloc(), GetLocalBufferStorage(), PageSetChecksumCopy(), palloc_aligned(), and smgr_bulk_get_buf().

◆ MemoryContextAllocationFailure()

void * MemoryContextAllocationFailure ( MemoryContext  context,
Size  size,
int  flags 
)

Definition at line 1198 of file mcxt.c.

1199{
1200 if ((flags & MCXT_ALLOC_NO_OOM) == 0)
1201 {
1202 if (TopMemoryContext)
1204 ereport(ERROR,
1206 errmsg("out of memory"),
1207 errdetail("Failed on request of size %zu in memory context \"%s\".",
1208 size, context->name)));
1209 }
1210 return NULL;
1211}

References ereport, errcode(), errdetail(), errmsg(), ERROR, fb(), MCXT_ALLOC_NO_OOM, MemoryContextStats(), MemoryContextData::name, and TopMemoryContext.

Referenced by AlignedAllocRealloc(), AllocSetAllocFromNewBlock(), AllocSetAllocLarge(), AllocSetRealloc(), BumpAllocFromNewBlock(), BumpAllocLarge(), GenerationAllocFromNewBlock(), GenerationAllocLarge(), GenerationRealloc(), and SlabAllocFromNewBlock().

◆ MemoryContextAllocExtended()

void * MemoryContextAllocExtended ( MemoryContext  context,
Size  size,
int  flags 
)

Definition at line 1289 of file mcxt.c.

1290{
1291 void *ret;
1292
1293 Assert(MemoryContextIsValid(context));
1295
1296 if (!((flags & MCXT_ALLOC_HUGE) != 0 ? AllocHugeSizeIsValid(size) :
1297 AllocSizeIsValid(size)))
1298 elog(ERROR, "invalid memory alloc request size %zu", size);
1299
1300 context->isReset = false;
1301
1302 ret = context->methods->alloc(context, size, flags);
1303 if (unlikely(ret == NULL))
1304 return NULL;
1305
1306 VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1307
1308 if ((flags & MCXT_ALLOC_ZERO) != 0)
1309 MemSetAligned(ret, 0, size);
1310
1311 return ret;
1312}

References MemoryContextMethods::alloc, AllocHugeSizeIsValid, AllocSizeIsValid, Assert, AssertNotInCriticalSection, elog, ERROR, fb(), MemoryContextData::isReset, MCXT_ALLOC_HUGE, MCXT_ALLOC_ZERO, MemoryContextIsValid, MemSetAligned, MemoryContextData::methods, unlikely, and VALGRIND_MEMPOOL_ALLOC.

Referenced by BackgroundWorkerStateChange(), DynaHashAlloc(), guc_malloc(), guc_realloc(), libpqsrv_PQwrap(), MemoryContextAllocAligned(), pagetable_allocate(), and RegisterBackgroundWorker().

◆ MemoryContextAllocHuge()

void * MemoryContextAllocHuge ( MemoryContext  context,
Size  size 
)

Definition at line 1725 of file mcxt.c.

1726{
1727 void *ret;
1728
1729 Assert(MemoryContextIsValid(context));
1731
1732 context->isReset = false;
1733
1734 /*
1735 * For efficiency reasons, we purposefully offload the handling of
1736 * allocation failures to the MemoryContextMethods implementation as this
1737 * allows these checks to be performed only when an actual malloc needs to
1738 * be done to request more memory from the OS. Additionally, not having
1739 * to execute any instructions after this call allows the compiler to use
1740 * the sibling call optimization. If you're considering adding code after
1741 * this call, consider making it the responsibility of the 'alloc'
1742 * function instead.
1743 */
1744 ret = context->methods->alloc(context, size, MCXT_ALLOC_HUGE);
1745
1746 VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1747
1748 return ret;
1749}

References MemoryContextMethods::alloc, Assert, AssertNotInCriticalSection, MemoryContextData::isReset, MCXT_ALLOC_HUGE, MemoryContextIsValid, MemoryContextData::methods, and VALGRIND_MEMPOOL_ALLOC.

Referenced by perform_default_encoding_conversion(), pg_buffercache_os_pages_internal(), pg_buffercache_pages(), pg_do_encoding_conversion(), and pgstat_read_current_status().

◆ MemoryContextAllocZero()

void * MemoryContextAllocZero ( MemoryContext  context,
Size  size 
)

Definition at line 1266 of file mcxt.c.

1267{
1268 void *ret;
1269
1270 Assert(MemoryContextIsValid(context));
1272
1273 context->isReset = false;
1274
1275 ret = context->methods->alloc(context, size, 0);
1276
1277 VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1278
1279 MemSetAligned(ret, 0, size);
1280
1281 return ret;
1282}

References MemoryContextMethods::alloc, Assert, AssertNotInCriticalSection, MemoryContextData::isReset, MemoryContextIsValid, MemSetAligned, MemoryContextData::methods, and VALGRIND_MEMPOOL_ALLOC.

Referenced by add_tabstat_xact_level(), AllocateAttribute(), array_set_element_expanded(), array_sort_internal(), AttrDefaultFetch(), cached_function_compile(), CheckNNConstraintFetch(), ClientAuthentication(), create_pg_locale_builtin(), create_pg_locale_icu(), create_pg_locale_libc(), CreatePortal(), CreateWaitEventSet(), DCH_cache_getnew(), ensure_record_cache_typmod_slot_exists(), ExecHashBuildSkewHash(), ExecParallelRetrieveJitInstrumentation(), expandColorTrigrams(), fmgr_security_definer(), gistAllocateNewPageBuffer(), index_form_tuple_context(), init_MultiFuncCall(), init_sql_fcache(), initArrayResultArr(), InitializeSession(), InitWalSender(), InitXLogInsert(), json_populate_type(), jsonb_agg_transfn_worker(), jsonb_object_agg_transfn_worker(), llvm_create_context(), load_relcache_init_file(), LookupOpclassInfo(), make_expanded_record_from_datum(), newLOfd(), NUM_cache_getnew(), pg_decode_begin_prepare_txn(), pg_decode_begin_txn(), pg_decode_stream_start(), pgoutput_begin_txn(), pgstat_prep_pending_entry(), pgstat_register_kind(), PLy_exec_function(), PLy_function_save_args(), PLy_input_setup_func(), PLy_input_setup_tuple(), PLy_output_setup_func(), PLy_output_setup_tuple(), populate_record_worker(), populate_recordset_worker(), prepare_column_cache(), PrepareInvalidationState(), push_old_value(), PushTransaction(), px_find_cipher(), RehashCatCache(), RehashCatCacheLists(), RelationBuildPartitionDesc(), RelationBuildPartitionKey(), RelationBuildRowSecurity(), RelationBuildTupleDesc(), RelationInitIndexAccessInfo(), ReorderBufferCopySnap(), ReorderBufferIterTXNInit(), ReorderBufferRestoreChange(), ResourceOwnerCreate(), ResourceOwnerEnlarge(), satisfies_hash_partition(), SearchCatCacheList(), secure_open_gssapi(), SetConstraintStateCreate(), SetPlannerGlobalExtensionState(), SetPlannerInfoExtensionState(), SetRelOptInfoExtensionState(), SnapBuildBuildSnapshot(), SnapBuildRestoreSnapshot(), spgGetCache(), sts_puttuple(), ts_accum(), ts_stat_sql(), and WinGetPartitionLocalMemory().

◆ MemoryContextAllowInCriticalSection()

void MemoryContextAllowInCriticalSection ( MemoryContext  context,
bool  allow 
)

Definition at line 743 of file mcxt.c.

744{
746
747 context->allowInCritSection = allow;
748}

References MemoryContextData::allowInCritSection, Assert, fb(), and MemoryContextIsValid.

Referenced by InitSync(), MemoryContextInit(), and XLOGShmemInit().

◆ MemoryContextCallResetCallbacks()

static void MemoryContextCallResetCallbacks ( MemoryContext  context)
static

Definition at line 634 of file mcxt.c.

635{
637
638 /*
639 * We pop each callback from the list before calling. That way, if an
640 * error occurs inside the callback, we won't try to call it a second time
641 * in the likely event that we reset or delete the context later.
642 */
643 while ((cb = context->reset_cbs) != NULL)
644 {
645 context->reset_cbs = cb->next;
646 cb->func(cb->arg);
647 }
648}

References MemoryContextCallback::arg, fb(), MemoryContextCallback::func, MemoryContextCallback::next, and MemoryContextData::reset_cbs.

Referenced by MemoryContextDeleteOnly(), and MemoryContextResetOnly().

◆ MemoryContextCreate()

void MemoryContextCreate ( MemoryContext  node,
NodeTag  tag,
MemoryContextMethodID  method_id,
MemoryContext  parent,
const char name 
)

Definition at line 1149 of file mcxt.c.

1154{
1155 /* Creating new memory contexts is not allowed in a critical section */
1157
1158 /* Validate parent, to help prevent crazy context linkages */
1159 Assert(parent == NULL || MemoryContextIsValid(parent));
1160 Assert(node != parent);
1161
1162 /* Initialize all standard fields of memory context header */
1163 node->type = tag;
1164 node->isReset = true;
1165 node->methods = &mcxt_methods[method_id];
1166 node->parent = parent;
1167 node->firstchild = NULL;
1168 node->mem_allocated = 0;
1169 node->prevchild = NULL;
1170 node->name = name;
1171 node->ident = NULL;
1172 node->reset_cbs = NULL;
1173
1174 /* OK to link node into context tree */
1175 if (parent)
1176 {
1177 node->nextchild = parent->firstchild;
1178 if (parent->firstchild != NULL)
1179 parent->firstchild->prevchild = node;
1180 parent->firstchild = node;
1181 /* inherit allowInCritSection flag from parent */
1182 node->allowInCritSection = parent->allowInCritSection;
1183 }
1184 else
1185 {
1186 node->nextchild = NULL;
1187 node->allowInCritSection = false;
1188 }
1189}

References MemoryContextData::allowInCritSection, Assert, CritSectionCount, fb(), MemoryContextData::firstchild, MemoryContextData::ident, MemoryContextData::isReset, mcxt_methods, MemoryContextData::mem_allocated, MemoryContextIsValid, MemoryContextData::methods, name, MemoryContextData::name, MemoryContextData::nextchild, MemoryContextData::parent, MemoryContextData::prevchild, and MemoryContextData::reset_cbs.

Referenced by AllocSetContextCreateInternal(), BumpContextCreate(), GenerationContextCreate(), and SlabContextCreate().

◆ MemoryContextDelete()

void MemoryContextDelete ( MemoryContext  context)

Definition at line 472 of file mcxt.c.

473{
475
477
478 /*
479 * Delete subcontexts from the bottom up.
480 *
481 * Note: Do not use recursion here. A "stack depth limit exceeded" error
482 * would be unpleasant if we're already in the process of cleaning up from
483 * transaction abort. We also cannot use MemoryContextTraverseNext() here
484 * because we modify the tree as we go.
485 */
486 curr = context;
487 for (;;)
488 {
489 MemoryContext parent;
490
491 /* Descend down until we find a leaf context with no children */
492 while (curr->firstchild != NULL)
494
495 /*
496 * We're now at a leaf with no children. Free it and continue from the
497 * parent. Or if this was the original node, we're all done.
498 */
499 parent = curr->parent;
501
502 if (curr == context)
503 break;
504 curr = parent;
505 }
506}

References Assert, fb(), MemoryContextData::firstchild, MemoryContextDeleteOnly(), MemoryContextIsValid, and MemoryContextData::parent.

Referenced by _brin_parallel_merge(), AfterTriggerEndXact(), afterTriggerInvokeEvents(), ApplyLauncherMain(), AtEOSubXact_SPI(), AtEOXact_LargeObject(), AtSubCleanup_Memory(), AtSubCommit_Memory(), AttachPartitionEnsureIndexes(), AutoVacLauncherMain(), autovacuum_do_vac_analyze(), AutoVacWorkerMain(), AuxiliaryProcessMainCommon(), BackgroundWorkerMain(), blbuild(), blinsert(), brin_free_desc(), brin_minmax_multi_union(), bringetbitmap(), brininsert(), bt_check_every_level(), btendscan(), btree_xlog_cleanup(), btvacuumscan(), BuildParamLogString(), BuildRelationExtStatistics(), CloneRowTriggersToPartition(), cluster(), compactify_ranges(), compile_plperl_function(), compile_pltcl_function(), compute_expr_stats(), compute_index_stats(), ComputeExtStatisticsRows(), createTrgmNFA(), CreateTriggerFiringOn(), daitch_mokotoff(), decr_dcc_refcount(), DeleteExpandedObject(), DiscreteKnapsack(), do_analyze_rel(), do_start_worker(), DoCopyTo(), DropCachedPlan(), each_worker(), each_worker_jsonb(), elements_worker(), elements_worker_jsonb(), end_heap_rewrite(), EndCopy(), EndCopyFrom(), ensure_free_space_in_buffer(), EventTriggerEndCompleteQuery(), EventTriggerInvoke(), exec_simple_query(), ExecEndAgg(), ExecEndMemoize(), ExecEndRecursiveUnion(), ExecEndSetOp(), ExecEndWindowAgg(), ExecHashTableDestroy(), execute_sql_string(), ExecVacuum(), file_acquire_sample_rows(), fill_hba_view(), fill_ident_view(), free_auth_file(), free_plperl_function(), FreeCachedExpression(), FreeDecodingContext(), FreeExecutorState(), FreeExprContext(), freeGISTstate(), FreeSnapshotBuilder(), geqo_eval(), get_actual_variable_range(), get_rel_sync_entry(), GetWALRecordsInfo(), GetXLogSummaryStats(), gin_check_parent_keys_consistency(), gin_check_posting_tree_parent_keys_consistency(), gin_xlog_cleanup(), ginbuild(), ginbulkdelete(), ginendscan(), gininsert(), ginInsertCleanup(), ginPlaceToPage(), gist_xlog_cleanup(), gistbuild(), gistvacuumscan(), hash_destroy(), inline_function(), inline_function_in_from(), libpqrcv_processTuples(), load_hba(), load_ident(), load_tzoffsets(), makeArrayResultArr(), makeMdArrayResult(), materializeQueryResult(), MemoryContextDeleteChildren(), NIFinishBuild(), pg_backup_stop(), pg_decode_shutdown(), pg_get_wal_block_info(), pgstat_clear_backend_activity_snapshot(), pgstat_clear_snapshot(), plperl_spi_freeplan(), plperl_spi_prepare(), plpgsql_free_function_memory(), pltcl_handler(), pltcl_SPI_prepare(), PLy_cursor_dealloc(), PLy_cursor_plan(), PLy_plan_dealloc(), PLy_pop_execution_context(), PLy_procedure_delete(), PLy_spi_execute_fetch_result(), PLy_spi_execute_plan(), PortalDrop(), PostgresMain(), postquel_end(), prepare_next_query(), printtup_shutdown(), ProcessConfigFile(), publicationListToArray(), RE_compile_and_cache(), rebuild_database_list(), ReindexMultipleTables(), ReindexPartitions(), ReindexRelationConcurrently(), RelationBuildDesc(), RelationBuildRuleLock(), RelationDestroyRelation(), ReleaseCachedPlan(), ReorderBufferFree(), ResetUnloggedRelations(), RevalidateCachedQuery(), serializeAnalyzeShutdown(), shdepReassignOwned(), shutdown_MultiFuncCall(), spg_xlog_cleanup(), spgbuild(), spgendscan(), spginsert(), SPI_finish(), SPI_freeplan(), SPI_freetuptable(), sql_delete_callback(), statext_dependencies_build(), strlist_to_textarray(), SysLoggerMain(), test_pattern(), TidStoreDestroy(), tokenize_auth_file(), tuplesort_end(), tuplestore_end(), union_tuples(), UploadManifest(), and validateForeignKeyConstraint().

◆ MemoryContextDeleteChildren()

void MemoryContextDeleteChildren ( MemoryContext  context)

Definition at line 555 of file mcxt.c.

556{
558
559 /*
560 * MemoryContextDelete will delink the child from me, so just iterate as
561 * long as there is a child.
562 */
563 while (context->firstchild != NULL)
565}

References Assert, fb(), MemoryContextData::firstchild, MemoryContextDelete(), and MemoryContextIsValid.

Referenced by AtAbort_Portals(), AtSubAbort_Portals(), exec_stmt_block(), MemoryContextReset(), PersistHoldablePortal(), PortalRunMulti(), and RelationCloseCleanup().

◆ MemoryContextDeleteOnly()

static void MemoryContextDeleteOnly ( MemoryContext  context)
static

Definition at line 514 of file mcxt.c.

515{
517 /* We had better not be deleting TopMemoryContext ... */
518 Assert(context != TopMemoryContext);
519 /* And not CurrentMemoryContext, either */
520 Assert(context != CurrentMemoryContext);
521 /* All the children should've been deleted already */
522 Assert(context->firstchild == NULL);
523
524 /*
525 * It's not entirely clear whether 'tis better to do this before or after
526 * delinking the context; but an error in a callback will likely result in
527 * leaking the whole context (if it's not a root context) if we do it
528 * after, so let's do it before.
529 */
531
532 /*
533 * We delink the context from its parent before deleting it, so that if
534 * there's an error we won't have deleted/busted contexts still attached
535 * to the context tree. Better a leak than a crash.
536 */
538
539 /*
540 * Also reset the context's ident pointer, in case it points into the
541 * context. This would only matter if someone tries to get stats on the
542 * (already unlinked) context, which is unlikely, but let's be safe.
543 */
544 context->ident = NULL;
545
546 context->methods->delete_context(context);
547}

References Assert, CurrentMemoryContext, MemoryContextMethods::delete_context, fb(), MemoryContextData::firstchild, MemoryContextData::ident, MemoryContextCallResetCallbacks(), MemoryContextIsValid, MemoryContextSetParent(), MemoryContextData::methods, and TopMemoryContext.

Referenced by MemoryContextDelete().

◆ MemoryContextGetParent()

MemoryContext MemoryContextGetParent ( MemoryContext  context)

◆ MemoryContextInit()

void MemoryContextInit ( void  )

Definition at line 359 of file mcxt.c.

360{
362
363 /*
364 * First, initialize TopMemoryContext, which is the parent of all others.
365 */
367 "TopMemoryContext",
369
370 /*
371 * Not having any other place to point CurrentMemoryContext, make it point
372 * to TopMemoryContext. Caller should change this soon!
373 */
375
376 /*
377 * Initialize ErrorContext as an AllocSetContext with slow growth rate ---
378 * we don't really expect much to be allocated in it. More to the point,
379 * require it to contain at least 8K at all times. This is the only case
380 * where retained memory in a context is *essential* --- we want to be
381 * sure ErrorContext still has some memory even if we've run out
382 * elsewhere! Also, allow allocations in ErrorContext within a critical
383 * section. Otherwise a PANIC will cause an assertion failure in the error
384 * reporting code, before printing out the real cause of the failure.
385 *
386 * This should be the last step in this function, as elog.c assumes memory
387 * management works once ErrorContext is non-null.
388 */
390 "ErrorContext",
391 8 * 1024,
392 8 * 1024,
393 8 * 1024);
395}

References ALLOCSET_DEFAULT_SIZES, AllocSetContextCreate, Assert, CurrentMemoryContext, ErrorContext, fb(), MemoryContextAllowInCriticalSection(), and TopMemoryContext.

Referenced by main().

◆ MemoryContextIsEmpty()

bool MemoryContextIsEmpty ( MemoryContext  context)

Definition at line 792 of file mcxt.c.

793{
795
796 /*
797 * For now, we consider a memory context nonempty if it has any children;
798 * perhaps this should be changed later.
799 */
800 if (context->firstchild != NULL)
801 return false;
802 /* Otherwise use the type-specific inquiry */
803 return context->methods->is_empty(context);
804}

References Assert, fb(), MemoryContextData::firstchild, MemoryContextMethods::is_empty, MemoryContextIsValid, and MemoryContextData::methods.

Referenced by AtSubCommit_Memory().

◆ MemoryContextMemAllocated()

Size MemoryContextMemAllocated ( MemoryContext  context,
bool  recurse 
)

Definition at line 811 of file mcxt.c.

812{
813 Size total = context->mem_allocated;
814
816
817 if (recurse)
818 {
819 for (MemoryContext curr = context->firstchild;
820 curr != NULL;
822 {
823 total += curr->mem_allocated;
824 }
825 }
826
827 return total;
828}

References Assert, fb(), MemoryContextData::firstchild, MemoryContextData::mem_allocated, MemoryContextIsValid, and MemoryContextTraverseNext().

Referenced by hash_agg_check_limits(), hash_agg_update_metrics(), and RT_MEMORY_USAGE().

◆ MemoryContextMemConsumed()

void MemoryContextMemConsumed ( MemoryContext  context,
MemoryContextCounters consumed 
)

Definition at line 835 of file mcxt.c.

837{
839
840 memset(consumed, 0, sizeof(*consumed));
841
842 /* Examine the context itself */
843 context->methods->stats(context, NULL, NULL, consumed, false);
844
845 /* Examine children, using iteration not recursion */
846 for (MemoryContext curr = context->firstchild;
847 curr != NULL;
849 {
850 curr->methods->stats(curr, NULL, NULL, consumed, false);
851 }
852}

References Assert, fb(), MemoryContextData::firstchild, MemoryContextIsValid, MemoryContextTraverseNext(), MemoryContextData::methods, and MemoryContextMethods::stats.

Referenced by ExplainExecuteQuery(), and standard_ExplainOneQuery().

◆ MemoryContextRegisterResetCallback()

void MemoryContextRegisterResetCallback ( MemoryContext  context,
MemoryContextCallback cb 
)

Definition at line 582 of file mcxt.c.

584{
586
587 /* Push onto head so this will be called before older registrants. */
588 cb->next = context->reset_cbs;
589 context->reset_cbs = cb;
590 /* Mark the context as non-reset (it probably is already). */
591 context->isReset = false;
592}

References Assert, MemoryContextData::isReset, MemoryContextIsValid, MemoryContextCallback::next, and MemoryContextData::reset_cbs.

Referenced by expanded_record_fetch_tupdesc(), init_sql_fcache(), InitDomainConstraintRef(), libpqsrv_PGresultSetParent(), libpqsrv_PQwrap(), load_validator_library(), make_expanded_record_from_exprecord(), make_expanded_record_from_tupdesc(), make_expanded_record_from_typeid(), pgoutput_startup(), and PLy_exec_function().

◆ MemoryContextReset()

void MemoryContextReset ( MemoryContext  context)

Definition at line 403 of file mcxt.c.

404{
406
407 /* save a function call in common case where there are no children */
408 if (context->firstchild != NULL)
410
411 /* save a function call if no pallocs since startup or last reset */
412 if (!context->isReset)
413 MemoryContextResetOnly(context);
414}

References Assert, fb(), MemoryContextData::firstchild, MemoryContextData::isReset, MemoryContextDeleteChildren(), MemoryContextIsValid, and MemoryContextResetOnly().

Referenced by _brin_parallel_merge(), _bt_preprocess_array_keys(), _gin_parallel_merge(), _SPI_end_call(), AfterTriggerExecute(), apply_spooled_messages(), AtCleanup_Memory(), AtCommit_Memory(), AtEOSubXact_SPI(), AtSubCleanup_Memory(), AutoVacLauncherMain(), BackgroundWriterMain(), bloomBuildCallback(), brin_memtuple_initialize(), bringetbitmap(), brininsert(), bt_check_level_from_leftmost(), btree_redo(), btvacuumpage(), BuildEventTriggerCache(), BuildRelationExtStatistics(), cache_purge_all(), check_domain_for_new_field(), check_domain_for_new_tuple(), CheckpointerMain(), CloneRowTriggersToPartition(), compute_expr_stats(), compute_index_stats(), CopyOneRowTo(), CreateTriggerFiringOn(), do_analyze_rel(), do_autovacuum(), dumptuples(), each_object_field_end(), each_worker_jsonb(), elements_array_element_end(), elements_worker_jsonb(), errfinish(), errstart(), eval_windowaggregates(), EventTriggerInvoke(), exec_dynquery_with_params(), exec_replication_command(), exec_stmt_block(), exec_stmt_dynexecute(), exec_stmt_forc(), exec_stmt_foreach_a(), exec_stmt_open(), exec_stmt_raise(), exec_stmt_return_query(), ExecFindMatchingSubPlans(), ExecHashTableReset(), ExecMakeTableFunctionResult(), ExecProjectSet(), ExecQualAndReset(), ExecRecursiveUnion(), execTuplesUnequal(), execute_foreign_modify(), expanded_record_set_field_internal(), expanded_record_set_tuple(), fetch_more_data(), file_acquire_sample_rows(), FlushErrorState(), get_rel_sync_entry(), get_short_term_cxt(), GetWALRecordsInfo(), GetXLogSummaryStats(), gin_redo(), ginBuildCallback(), ginFlushBuildState(), ginFreeScanKeys(), ginHeapTupleBulkInsert(), ginInsertCleanup(), ginVacuumPostingTreeLeaves(), gist_indexsortbuild(), gist_redo(), gistBuildCallback(), gistgetbitmap(), gistgettuple(), gistinsert(), gistProcessEmptyingQueue(), gistrescan(), gistScanPage(), gistSortedBuildCallback(), heapam_index_build_range_scan(), heapam_index_validate_scan(), IndexCheckExclusion(), init_execution_state(), initialize_windowaggregate(), InvalidateEventCacheCallback(), keyGetItem(), libpqrcv_processTuples(), LogicalParallelApplyLoop(), LogicalRepApplyLoop(), lookup_ts_dictionary_cache(), make_tuple_from_result_row(), perform_work_item(), pg_backup_start(), pg_decode_change(), pg_decode_truncate(), pg_get_wal_block_info(), pgarch_archiveXlog(), pgoutput_change(), pgoutput_truncate(), plperl_return_next_internal(), PLy_input_convert(), PLy_input_from_tuple(), PostgresMain(), printtup(), process_ordered_aggregate_single(), ProcessParallelApplyMessages(), ProcessParallelMessages(), release_partition(), ReScanExprContext(), resetSpGistScanOpaque(), ResetTupleHashTable(), RT_FREE(), scanPendingInsert(), sepgsql_avc_reset(), serializeAnalyzeReceive(), spcache_init(), spg_redo(), spginsert(), spgistBuildCallback(), spgWalk(), startScanKey(), statext_dependencies_build(), storeRow(), stream_stop_internal(), tfuncFetchRows(), tfuncLoadRows(), tuplesort_free(), tuplestore_clear(), validateForeignKeyConstraint(), WalSummarizerMain(), and WalWriterMain().

◆ MemoryContextResetChildren()

void MemoryContextResetChildren ( MemoryContext  context)

Definition at line 451 of file mcxt.c.

452{
454
455 for (MemoryContext curr = context->firstchild;
456 curr != NULL;
458 {
460 }
461}

References Assert, fb(), MemoryContextData::firstchild, MemoryContextIsValid, MemoryContextResetOnly(), and MemoryContextTraverseNext().

◆ MemoryContextResetOnly()

void MemoryContextResetOnly ( MemoryContext  context)

Definition at line 422 of file mcxt.c.

423{
425
426 /* Nothing to do if no pallocs since startup or last reset */
427 if (!context->isReset)
428 {
430
431 /*
432 * If context->ident points into the context's memory, it will become
433 * a dangling pointer. We could prevent that by setting it to NULL
434 * here, but that would break valid coding patterns that keep the
435 * ident elsewhere, e.g. in a parent context. So for now we assume
436 * the programmer got it right.
437 */
438
439 context->methods->reset(context);
440 context->isReset = true;
441 }
442}

References Assert, MemoryContextData::isReset, MemoryContextCallResetCallbacks(), MemoryContextIsValid, MemoryContextData::methods, and MemoryContextMethods::reset.

Referenced by AllocSetDelete(), JsonTableResetRowPattern(), MemoryContextReset(), MemoryContextResetChildren(), and mergeruns().

◆ MemoryContextSetIdentifier()

◆ MemoryContextSetParent()

void MemoryContextSetParent ( MemoryContext  context,
MemoryContext  new_parent 
)

Definition at line 686 of file mcxt.c.

687{
689 Assert(context != new_parent);
690
691 /* Fast path if it's got correct parent already */
692 if (new_parent == context->parent)
693 return;
694
695 /* Delink from existing parent, if any */
696 if (context->parent)
697 {
698 MemoryContext parent = context->parent;
699
700 if (context->prevchild != NULL)
701 context->prevchild->nextchild = context->nextchild;
702 else
703 {
704 Assert(parent->firstchild == context);
705 parent->firstchild = context->nextchild;
706 }
707
708 if (context->nextchild != NULL)
709 context->nextchild->prevchild = context->prevchild;
710 }
711
712 /* And relink */
713 if (new_parent)
714 {
716 context->parent = new_parent;
717 context->prevchild = NULL;
718 context->nextchild = new_parent->firstchild;
719 if (new_parent->firstchild != NULL)
720 new_parent->firstchild->prevchild = context;
721 new_parent->firstchild = context;
722 }
723 else
724 {
725 context->parent = NULL;
726 context->prevchild = NULL;
727 context->nextchild = NULL;
728 }
729}

References Assert, fb(), MemoryContextData::firstchild, MemoryContextIsValid, MemoryContextData::nextchild, MemoryContextData::parent, and MemoryContextData::prevchild.

Referenced by _SPI_save_plan(), CachedPlanSetParentContext(), CompleteCachedPlan(), exec_parse_message(), GetCachedExpression(), GetCachedPlan(), load_domaintype_info(), MemoryContextDeleteOnly(), plpgsql_compile_callback(), RE_compile_and_cache(), RelationBuildPartitionDesc(), RelationBuildPartitionKey(), RelationBuildRowSecurity(), RelationRebuildRelation(), RevalidateCachedQuery(), SaveCachedPlan(), SPI_keepplan(), sql_compile_callback(), TransferExpandedObject(), and UploadManifest().

◆ MemoryContextSizeFailure()

void MemoryContextSizeFailure ( MemoryContext  context,
Size  size,
int  flags 
)

Definition at line 1219 of file mcxt.c.

1220{
1221 elog(ERROR, "invalid memory alloc request size %zu", size);
1222}

References elog, and ERROR.

Referenced by MemoryContextCheckSize().

◆ MemoryContextStats()

void MemoryContextStats ( MemoryContext  context)

Definition at line 863 of file mcxt.c.

864{
865 /* Hard-wired limits are usually good enough */
866 MemoryContextStatsDetail(context, 100, 100, true);
867}

References MemoryContextStatsDetail().

Referenced by AllocSetContextCreateInternal(), BumpContextCreate(), finish_xact_command(), GenerationContextCreate(), MemoryContextAllocationFailure(), SlabContextCreate(), and test_pattern().

◆ MemoryContextStatsDetail()

void MemoryContextStatsDetail ( MemoryContext  context,
int  max_level,
int  max_children,
bool  print_to_stderr 
)

Definition at line 878 of file mcxt.c.

881{
883
884 memset(&grand_totals, 0, sizeof(grand_totals));
885
888
889 if (print_to_stderr)
891 "Grand total: %zu bytes in %zu blocks; %zu free (%zu chunks); %zu used\n",
892 grand_totals.totalspace, grand_totals.nblocks,
893 grand_totals.freespace, grand_totals.freechunks,
894 grand_totals.totalspace - grand_totals.freespace);
895 else
896 {
897 /*
898 * Use LOG_SERVER_ONLY to prevent the memory contexts from being sent
899 * to the connected client.
900 *
901 * We don't buffer the information about all memory contexts in a
902 * backend into StringInfo and log it as one message. That would
903 * require the buffer to be enlarged, risking an OOM as there could be
904 * a large number of memory contexts in a backend. Instead, we log
905 * one message per memory context.
906 */
908 (errhidestmt(true),
909 errhidecontext(true),
910 errmsg_internal("Grand total: %zu bytes in %zu blocks; %zu free (%zu chunks); %zu used",
911 grand_totals.totalspace, grand_totals.nblocks,
912 grand_totals.freespace, grand_totals.freechunks,
913 grand_totals.totalspace - grand_totals.freespace)));
914 }
915}

References ereport, errhidecontext(), errhidestmt(), errmsg_internal(), fb(), fprintf, LOG_SERVER_ONLY, and MemoryContextStatsInternal().

Referenced by MemoryContextStats(), and ProcessLogMemoryContextInterrupt().

◆ MemoryContextStatsInternal()

static void MemoryContextStatsInternal ( MemoryContext  context,
int  level,
int  max_level,
int  max_children,
MemoryContextCounters totals,
bool  print_to_stderr 
)
static

Definition at line 925 of file mcxt.c.

929{
930 MemoryContext child;
931 int ichild;
932
934
935 /* Examine the context itself */
936 context->methods->stats(context,
938 &level,
940
941 /*
942 * Examine children.
943 *
944 * If we are past the recursion depth limit or already running low on
945 * stack, do not print them explicitly but just summarize them. Similarly,
946 * if there are more than max_children of them, we do not print the rest
947 * explicitly, but just summarize them.
948 */
949 child = context->firstchild;
950 ichild = 0;
951 if (level <= max_level && !stack_is_too_deep())
952 {
953 for (; child != NULL && ichild < max_children;
954 child = child->nextchild, ichild++)
955 {
956 MemoryContextStatsInternal(child, level + 1,
958 totals,
960 }
961 }
962
963 if (child != NULL)
964 {
965 /* Summarize the rest of the children, avoiding recursion. */
967
968 memset(&local_totals, 0, sizeof(local_totals));
969
970 ichild = 0;
971 while (child != NULL)
972 {
973 child->methods->stats(child, NULL, NULL, &local_totals, false);
974 ichild++;
975 child = MemoryContextTraverseNext(child, context);
976 }
977
978 if (print_to_stderr)
979 {
980 for (int i = 0; i < level; i++)
981 fprintf(stderr, " ");
983 "%d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used\n",
984 ichild,
985 local_totals.totalspace,
986 local_totals.nblocks,
987 local_totals.freespace,
988 local_totals.freechunks,
989 local_totals.totalspace - local_totals.freespace);
990 }
991 else
993 (errhidestmt(true),
994 errhidecontext(true),
995 errmsg_internal("level: %d; %d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used",
996 level,
997 ichild,
998 local_totals.totalspace,
999 local_totals.nblocks,
1000 local_totals.freespace,
1001 local_totals.freechunks,
1002 local_totals.totalspace - local_totals.freespace)));
1003
1004 if (totals)
1005 {
1006 totals->nblocks += local_totals.nblocks;
1007 totals->freechunks += local_totals.freechunks;
1008 totals->totalspace += local_totals.totalspace;
1009 totals->freespace += local_totals.freespace;
1010 }
1011 }
1012}

References Assert, ereport, errhidecontext(), errhidestmt(), errmsg_internal(), fb(), MemoryContextData::firstchild, fprintf, i, LOG_SERVER_ONLY, MemoryContextIsValid, MemoryContextStatsInternal(), MemoryContextStatsPrint(), MemoryContextTraverseNext(), MemoryContextData::methods, MemoryContextData::nextchild, stack_is_too_deep(), and MemoryContextMethods::stats.

Referenced by MemoryContextStatsDetail(), and MemoryContextStatsInternal().

◆ MemoryContextStatsPrint()

static void MemoryContextStatsPrint ( MemoryContext  context,
void passthru,
const char stats_string,
bool  print_to_stderr 
)
static

Definition at line 1022 of file mcxt.c.

1025{
1026 int level = *(int *) passthru;
1027 const char *name = context->name;
1028 const char *ident = context->ident;
1029 char truncated_ident[110];
1030 int i;
1031
1032 /*
1033 * It seems preferable to label dynahash contexts with just the hash table
1034 * name. Those are already unique enough, so the "dynahash" part isn't
1035 * very helpful, and this way is more consistent with pre-v11 practice.
1036 */
1037 if (ident && strcmp(name, "dynahash") == 0)
1038 {
1039 name = ident;
1040 ident = NULL;
1041 }
1042
1043 truncated_ident[0] = '\0';
1044
1045 if (ident)
1046 {
1047 /*
1048 * Some contexts may have very long identifiers (e.g., SQL queries).
1049 * Arbitrarily truncate at 100 bytes, but be careful not to break
1050 * multibyte characters. Also, replace ASCII control characters, such
1051 * as newlines, with spaces.
1052 */
1053 int idlen = strlen(ident);
1054 bool truncated = false;
1055
1056 strcpy(truncated_ident, ": ");
1058
1059 if (idlen > 100)
1060 {
1061 idlen = pg_mbcliplen(ident, idlen, 100);
1062 truncated = true;
1063 }
1064
1065 while (idlen-- > 0)
1066 {
1067 unsigned char c = *ident++;
1068
1069 if (c < ' ')
1070 c = ' ';
1071 truncated_ident[i++] = c;
1072 }
1073 truncated_ident[i] = '\0';
1074
1075 if (truncated)
1076 strcat(truncated_ident, "...");
1077 }
1078
1079 if (print_to_stderr)
1080 {
1081 for (i = 1; i < level; i++)
1082 fprintf(stderr, " ");
1084 }
1085 else
1087 (errhidestmt(true),
1088 errhidecontext(true),
1089 errmsg_internal("level: %d; %s: %s%s",
1090 level, name, stats_string, truncated_ident)));
1091}

References ereport, errhidecontext(), errhidestmt(), errmsg_internal(), fb(), fprintf, i, MemoryContextData::ident, ident, LOG_SERVER_ONLY, name, MemoryContextData::name, and pg_mbcliplen().

Referenced by MemoryContextStatsInternal().

◆ MemoryContextStrdup()

◆ MemoryContextTraverseNext()

static MemoryContext MemoryContextTraverseNext ( MemoryContext  curr,
MemoryContext  top 
)
static

Definition at line 277 of file mcxt.c.

278{
279 /* After processing a node, traverse to its first child if any */
280 if (curr->firstchild != NULL)
281 return curr->firstchild;
282
283 /*
284 * After processing a childless node, traverse to its next sibling if
285 * there is one. If there isn't, traverse back up to the parent (which
286 * has already been visited, and now so have all its descendants). We're
287 * done if that is "top", otherwise traverse to its next sibling if any,
288 * otherwise repeat moving up.
289 */
290 while (curr->nextchild == NULL)
291 {
292 curr = curr->parent;
293 if (curr == top)
294 return NULL;
295 }
296 return curr->nextchild;
297}

References fb(), MemoryContextData::firstchild, MemoryContextData::nextchild, and MemoryContextData::parent.

Referenced by MemoryContextMemAllocated(), MemoryContextMemConsumed(), MemoryContextResetChildren(), and MemoryContextStatsInternal().

◆ MemoryContextUnregisterResetCallback()

void MemoryContextUnregisterResetCallback ( MemoryContext  context,
MemoryContextCallback cb 
)

Definition at line 607 of file mcxt.c.

609{
611 *cur;
612
614
615 for (prev = NULL, cur = context->reset_cbs; cur != NULL;
616 prev = cur, cur = cur->next)
617 {
618 if (cur != cb)
619 continue;
620 if (prev)
621 prev->next = cur->next;
622 else
623 context->reset_cbs = cur->next;
624 return;
625 }
626 Assert(false);
627}

References Assert, cur, fb(), MemoryContextIsValid, MemoryContextCallback::next, cursor::next, and MemoryContextData::reset_cbs.

Referenced by libpqsrv_PGresultSetParent(), and libpqsrv_PQclear().

◆ palloc()

void * palloc ( Size  size)

Definition at line 1387 of file mcxt.c.

1388{
1389 /* duplicates MemoryContextAlloc to avoid increased overhead */
1390 void *ret;
1392
1393 Assert(MemoryContextIsValid(context));
1395
1396 context->isReset = false;
1397
1398 /*
1399 * For efficiency reasons, we purposefully offload the handling of
1400 * allocation failures to the MemoryContextMethods implementation as this
1401 * allows these checks to be performed only when an actual malloc needs to
1402 * be done to request more memory from the OS. Additionally, not having
1403 * to execute any instructions after this call allows the compiler to use
1404 * the sibling call optimization. If you're considering adding code after
1405 * this call, consider making it the responsibility of the 'alloc'
1406 * function instead.
1407 */
1408 ret = context->methods->alloc(context, size, 0);
1409 /* We expect OOM to be handled by the alloc function */
1410 Assert(ret != NULL);
1411 VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1412
1413 return ret;
1414}

References MemoryContextMethods::alloc, Assert, AssertNotInCriticalSection, CurrentMemoryContext, fb(), MemoryContextData::isReset, MemoryContextIsValid, MemoryContextData::methods, and VALGRIND_MEMPOOL_ALLOC.

Referenced by _bt_bottomupdel_pass(), _bt_dedup_pass(), _bt_delitems_delete_check(), _bt_delitems_update(), _bt_load(), _bt_mkscankey(), _bt_newlevel(), _bt_preprocess_array_keys(), _bt_simpledel_pass(), _bt_unmark_keys(), _intbig_alloc(), _ltree_picksplit(), _metaphone(), AbsorbSyncRequests(), accum_sum_copy(), accumArrayResultArr(), aclitemout(), aclmembers(), acquire_inherited_sample_rows(), add_exact_object_address_extra(), add_reloption(), addWrd(), adjust_appendrel_attrs_mutator(), allocate_recordbuf(), allocate_reloption(), AllocateRelationDesc(), AlterSubscription_refresh(), anybit_typmodout(), anychar_typmodout(), appendJSONKeyValueFmt(), AppendStringCommandOption(), apply_spooled_messages(), array_agg_array_combine(), array_agg_array_deserialize(), array_create_iterator(), array_map(), array_out(), array_recv(), array_replace_internal(), array_set_element(), ArrayGetIntegerTypmods(), Async_Notify(), autoinc(), bbsink_copystream_begin_backup(), be_loread(), be_tls_get_certificate_hash(), BeginCopyFrom(), binary_decode(), binary_encode(), binaryheap_allocate(), BipartiteMatch(), bit_and(), bit_catenate(), bit_or(), bit_out(), bit_recv(), bitfromint4(), bitfromint8(), bitnot(), bits_to_text(), bitsetbit(), bitshiftleft(), bitshiftright(), bitsubstring(), bitxor(), bms_copy(), boolout(), bottomup_sort_and_shrink(), box_poly(), bpchar(), bpchar_input(), bqarr_in(), brin_build_desc(), brin_copy_tuple(), brin_minmax_multi_distance_inet(), brin_page_items(), brin_range_deserialize(), brin_revmap_data(), bringetbitmap(), bt_normalize_tuple(), bt_page_items_internal(), bt_page_print_tuples(), btbeginscan(), btree_xlog_dedup(), btree_xlog_updates(), btreevacuumposting(), btrescan(), BufferSync(), build_column_frequencies(), build_distinct_groups(), build_function_result_tupdesc_d(), build_mvndistinct(), build_pertrans_for_aggref(), build_server_final_message(), build_server_first_message(), build_tlist_index(), build_tlist_index_other_vars(), build_tuplestore_recursively(), BuildTupleFromCStrings(), bytea_catenate(), bytea_reverse(), bytea_string_agg_finalfn(), byteain(), byteaout(), bytearecv(), calc_word_similarity(), CatalogCacheCreateEntry(), catenate_stringinfo_string(), char_bpchar(), char_text(), charout(), check_foreign_key(), check_ident_usermap(), check_primary_key(), check_temp_tablespaces(), checkSharedDependencies(), chr(), cidout(), cleanup_tsquery_stopwords(), collect_corrupt_items(), collectTSQueryValues(), compute_array_stats(), compute_distinct_stats(), compute_expr_stats(), compute_index_stats(), compute_range_stats(), compute_scalar_stats(), compute_tsvector_stats(), computeLeafRecompressWALData(), concat_text(), connect_pg_server(), consider_groupingsets_paths(), convert_prep_stmt_params(), convert_requires_to_datum(), convert_string_datum(), copy_file(), copy_pathtarget(), copy_plpgsql_datums(), CopyFromTextLikeStart(), CopyIndexTuple(), CopyLimitPrintoutLength(), copytext(), CopyTriggerDesc(), core_yyalloc(), core_yyrealloc(), count_usable_fds(), create_hash_bounds(), create_limit_plan(), create_list_bounds(), create_memoize_plan(), create_mergejoin_plan(), create_range_bounds(), create_secmsg(), CreateConstraintEntry(), CreateFunction(), CreatePartitionPruneState(), createPostingTree(), CreateTemplateTupleDesc(), CreateTriggerFiringOn(), CreateTupleDescCopyConstr(), cstring_to_text_with_len(), cube_recv(), current_database(), current_schemas(), dataBeginPlaceToPageLeaf(), datetime_format_has_tz(), datetime_to_char_body(), datumCopy(), datumRestore(), datumSerialize(), debackslash(), decodePageSplitRecord(), DeescapeQuotedString(), deparse_lquery(), deparse_ltree(), deserialize_deflist(), detoast_attr(), detoast_attr_slice(), detoast_external_attr(), disassembleLeaf(), DiscreteKnapsack(), div_var(), do_analyze_rel(), do_to_timestamp(), dobyteatrim(), DoCopyTo(), doPickSplit(), dotrim(), double_to_shortest_decimal(), downcase_convert(), downcase_identifier(), DropRelationsAllBuffers(), duplicate_numeric(), encrypt_password(), entry_dealloc(), enum_range_internal(), ExecAggRetrieveInstrumentation(), ExecBitmapHeapRetrieveInstrumentation(), ExecBitmapIndexScanRetrieveInstrumentation(), ExecEvalArrayExpr(), ExecGather(), ExecGatherMerge(), ExecGetJsonValueItemString(), ExecHashJoinGetSavedTuple(), ExecHashRetrieveInstrumentation(), ExecIncrementalSortRetrieveInstrumentation(), ExecIndexBuildScanKeys(), ExecIndexOnlyScanRetrieveInstrumentation(), ExecIndexScanRetrieveInstrumentation(), ExecInitAgg(), ExecInitAppend(), ExecInitExprRec(), ExecInitIndexScan(), ExecInitJunkFilter(), ExecInitMemoize(), ExecInitPartitionDispatchInfo(), ExecInitSubPlan(), ExecInitValuesScan(), ExecMakeTableFunctionResult(), ExecMemoizeRetrieveInstrumentation(), ExecParallelCreateReaders(), ExecParallelRetrieveInstrumentation(), ExecParallelSetupTupleQueues(), ExecSortRetrieveInstrumentation(), execTuplesHashPrepare(), execTuplesMatchPrepare(), ExecuteTruncateGuts(), ExplainCreateWorkersState(), extract_rollup_sets(), fallbackSplit(), file_acquire_sample_rows(), find_hash_columns(), find_in_path(), find_inheritance_children_extended(), FinishWalRecovery(), float4_to_char(), float4out(), float8_to_char(), float8out_internal(), float_to_shortest_decimal(), format_operator_extended(), format_procedure_extended(), formTextDatum(), formTextDatum(), FuncnameGetCandidates(), g_cube_picksplit(), g_int_picksplit(), g_intbig_picksplit(), gbt_bit_xfrm(), gbt_bool_union(), gbt_cash_union(), gbt_date_union(), gbt_enum_union(), gbt_float4_union(), gbt_float8_union(), gbt_inet_union(), gbt_int2_union(), gbt_int4_union(), gbt_int8_union(), gbt_intv_compress(), gbt_intv_union(), gbt_num_picksplit(), gbt_oid_union(), gbt_time_union(), gbt_ts_union(), gbt_uuid_compress(), gbt_uuid_union(), gbt_var_key_from_datum(), gbt_var_picksplit(), gen_random_uuid(), generate_normalized_query(), generate_restrict_key(), generate_trgm(), generate_trgm_only(), generate_uuidv7(), generate_wildcard_trgm(), generateHeadline(), genericPickSplit(), get_attribute_options(), get_environ(), get_extension_aux_control_filename(), get_extension_control_directories(), get_extension_script_filename(), get_func_arg_info(), get_func_input_arg_names(), get_func_signature(), get_func_trftypes(), get_name_for_var_field(), get_page_from_raw(), get_permutation(), get_raw_page_internal(), get_str_from_var(), get_str_from_var_sci(), get_tsearch_config_filename(), get_val(), GetMultiXactIdMembers(), GetPermutation(), GetRunningTransactionLocks(), GetWALBlockInfo(), ghstore_alloc(), ghstore_picksplit(), gin_extract_hstore(), gin_extract_hstore_query(), gin_leafpage_items(), GinBufferStoreTuple(), ginCompressPostingList(), GinDataLeafPageGetItems(), GinFormInteriorTuple(), ginHeapTupleFastInsert(), ginMergeItemPointers(), ginNewScanKey(), ginPostingListDecodeAllSegments(), ginReadTuple(), ginReadTupleWithoutState(), ginRedoRecompress(), ginVacuumPostingTreeLeaf(), gist_box_picksplit(), gist_indexsortbuild(), gist_indexsortbuild_levelstate_flush(), gist_page_items_bytea(), gistbeginscan(), gistfillitupvec(), gistGetItupFromPage(), gistgettuple(), gistMakeUnionItVec(), gistrescan(), gistScanPage(), gistSplitByKey(), gistSplitHalf(), gseg_picksplit(), gtrgm_alloc(), gtrgm_consistent(), gtrgm_picksplit(), gtsquery_picksplit(), gtsvector_alloc(), gtsvector_penalty(), gtsvector_picksplit(), hash_object_field_end(), hashagg_batch_read(), hashbpchar(), hashbpcharextended(), hashtext(), hashtextextended(), heap_copy_minimal_tuple(), heap_copy_tuple_as_datum(), heap_copytuple(), heap_copytuple_with_tuple(), heap_multi_insert(), heap_page_items(), heap_tuple_from_minimal_tuple(), hladdword(), hmac_finish(), hstore_akeys(), hstore_avals(), hstore_concat(), hstore_delete(), hstore_delete_array(), hstore_delete_hstore(), hstore_from_array(), hstore_from_arrays(), hstore_from_record(), hstore_out(), hstore_populate_record(), hstore_recv(), hstore_slice_to_array(), hstore_slice_to_hstore(), hstore_subscript_assign(), hstore_to_array_internal(), hstoreArrayToPairs(), hstorePairs(), icu_language_tag(), ImportSnapshot(), inet_gist_picksplit(), inet_set_masklen(), init_sexpr(), init_slab_allocator(), init_tsvector_parser(), InitDeadLockChecking(), InitJumble(), InitPostmasterChildSlots(), initStringInfoInternal(), InitWalRecovery(), inplaceGetInvalidationMessages(), int2out(), int2vectorout(), int44in(), int44out(), int4_to_char(), int4out(), int8_to_char(), int8out(), int_to_roman(), interpret_AS_clause(), interpret_function_parameter_list(), intervaltypmodout(), irbt_alloc(), json_manifest_finalize_file(), jsonb_object_keys(), JsonbValueToJsonb(), JsonEncodeDateTime(), jsonpath_yyalloc(), jsonpath_yyrealloc(), leafRepackItems(), libpqrcv_readtimelinehistoryfile(), like_fixed_prefix(), like_fixed_prefix_ci(), litbufdup(), llvm_compile_expr(), lo_get_fragment_internal(), load_domaintype_info(), load_enum_cache_data(), load_relcache_init_file(), logfile_getname(), logical_heap_rewrite_flush_mappings(), logicalrep_read_tuple(), LogicalRepSyncTableStart(), LogicalTapeFreeze(), LogicalTapeSetCreate(), LogicalTapeWrite(), lookup_var_attr_stats(), lpad(), lrq_alloc(), ltree2text(), ltree_gist_alloc(), ltree_picksplit(), ltree_prefix_eq_ci(), ltsInitReadBuffer(), lz4_compress_datum(), lz4_decompress_datum(), lz4_decompress_datum_slice(), macaddr8_out(), macaddr_out(), make_build_data(), make_colname_unique(), make_greater_string(), make_jsp_entry_node(), make_jsp_expr_node(), make_partitionedrel_pruneinfo(), make_pathtarget_from_tlist(), make_result_safe(), make_sort_from_groupcols(), make_sort_from_sortclauses(), make_text_key(), make_tuple_from_result_row(), make_tuple_indirect(), makeitem(), makeObjectName(), makeParamList(), mark_hl_fragments(), MatchNamedCall(), MatchText(), mbuf_create(), minimal_tuple_from_heap_tuple(), mock_scram_secret(), moveLeafs(), mul_var(), mXactCacheGetById(), new_list(), newLexeme(), nodeRead(), NUM_cache(), numeric_sortsupport(), numeric_to_char(), numeric_to_number(), numerictypmodout(), oid8out(), oidout(), oidvectorout(), oidvectortypes(), OpernameGetCandidates(), optionListToArray(), order_qual_clauses(), ordered_set_startup(), pad_eme_pkcs1_v15(), PageGetTempPage(), PageGetTempPageCopy(), PageGetTempPageCopySpecial(), palloc_btree_page(), parse_compress_specification(), parse_fcall_arguments(), parse_one_reloption(), parse_scram_secret(), parse_tsquery(), ParseLongOption(), parseRelOptions(), partition_bounds_copy(), path_add(), path_in(), path_poly(), path_recv(), percentile_cont_multi_final_common(), percentile_disc_multi_final(), PerformRadiusTransaction(), pg_armor(), pg_blocking_pids(), pg_convert(), pg_current_snapshot(), pg_dearmor(), pg_decrypt(), pg_decrypt_iv(), pg_detoast_datum_copy(), pg_digest(), pg_encrypt(), pg_encrypt_iv(), pg_get_constraintdef_worker(), pg_get_logical_snapshot_info(), pg_get_userbyid(), pg_hmac(), pg_import_system_collations(), pg_listening_channels(), pg_random_bytes(), pg_safe_snapshot_blocking_pids(), pg_snapshot_recv(), pglz_compress_datum(), pglz_decompress_datum(), pglz_decompress_datum_slice(), pgp_extract_armor_headers(), pgp_key_id_w(), pgp_mpi_alloc(), pgrowlocks(), pgss_shmem_startup(), pgstat_fetch_entry(), pgstat_get_transactional_drops(), placeChar(), plaintree(), plperl_spi_exec_prepared(), plperl_spi_prepare(), plperl_spi_query_prepared(), plperl_to_hstore(), plpgsql_ns_additem(), plpython_to_hstore(), pltcl_quote(), pltcl_SPI_execute_plan(), pltcl_SPI_prepare(), PLy_cursor_plan(), PLy_procedure_munge_source(), PLy_spi_execute_plan(), PLyObject_ToBytea(), pnstrdup(), policy_role_list_to_array(), poly_path(), populate_record(), populate_recordset_object_field_end(), populate_scalar(), PostmasterMain(), pq_getmsgtext(), prepare_sort_from_pathkeys(), prepare_sql_fn_parse_info(), preparePresortedCols(), preprocess_grouping_sets(), PrescanPreparedTransactions(), ProcessStartupPacket(), prs_setup_firstcall(), psprintf(), pullf_create(), pushf_create(), px_find_hmac(), QTNCopy(), queryin(), queue_listen(), quote_identifier(), quote_literal(), quote_literal_cstr(), range_gist_picksplit(), RE_compile(), RE_compile_and_cache(), read_binary_file(), read_client_final_message(), read_stream_begin_impl(), read_whole_file(), readDatum(), readtup_heap(), ReadTwoPhaseFile(), rebuild_database_list(), record_cmp(), record_eq(), record_image_cmp(), record_image_eq(), record_in(), record_recv(), regclassout(), regcollationout(), regcomp_auth_token(), regconfigout(), regdatabaseout(), regdictionaryout(), regexec_auth_token(), regexp_fixed_prefix(), regnamespaceout(), regoperout(), regprocout(), regroleout(), regtypeout(), RelationBuildPartitionDesc(), RelationBuildTriggers(), RememberToFreeTupleDescAtEOX(), remove_dbtablespaces(), ReorderBufferQueueMessage(), repeat(), replace_text_regexp(), report_json_context(), resizeString(), rot13_passphrase(), rpad(), save_state_data(), scanner_init(), scram_build_secret(), scram_verify_plain_password(), SearchCatCacheList(), secure_open_server(), seg_out(), select_outer_pathkeys_for_merge(), sepgsql_fmgr_hook(), seq_redo(), serialize_expr_stats(), SerializeTransactionState(), set_relation_column_names(), set_rtable_names(), set_var_from_str(), setup_firstcall(), setup_pct_info(), setup_regexp_matches(), setup_test_matches(), show_trgm(), similar_escape_internal(), slot_fill_defaults(), spg_text_inner_consistent(), spg_text_leaf_consistent(), spgAllocSearchItem(), spgist_name_inner_consistent(), spgNewHeapItem(), SplitToVariants(), StartPrepare(), startScanKey(), statext_mcv_build(), statext_mcv_deserialize(), statext_ndistinct_build(), statext_ndistinct_deserialize(), statext_ndistinct_serialize(), StoreRelCheck(), str_casefold(), str_initcap(), str_tolower(), str_toupper(), str_udeescape(), string_to_bytea_const(), strlower_libc_mb(), strncoll_libc(), strnxfrm_libc(), strtitle_libc_mb(), strupper_libc_mb(), subxact_info_add(), subxact_info_read(), sync_queue_init(), test_custom_stats_var_from_serialized_data(), test_enc_conversion(), test_pattern(), test_random(), test_re_compile(), test_resowner_many(), test_resowner_priorities(), testdelete(), text_catenate(), text_reverse(), text_substring(), text_to_bits(), text_to_cstring(), TidListEval(), toast_fetch_datum(), toast_fetch_datum_slice(), toast_save_datum(), transformRelOptions(), translate(), TS_phrase_output(), ts_process_call(), tsqueryout(), tsqueryrecv(), tsquerytree(), tsvector_setweight(), tsvector_setweight_by_filter(), tsvector_to_array(), tsvector_unnest(), tsvectorout(), tuple_data_split_internal(), tuplesort_begin_batch(), tuplesort_putbrintuple(), tuplesort_putgintuple(), tuplestore_begin_common(), unicode_is_normalized(), unicode_normalize_func(), update_attstats(), uuid_decrement(), uuid_increment(), uuid_out(), uuid_recv(), uuid_skipsupport(), vac_open_indexes(), varbit(), varbit_out(), varbit_recv(), varstr_levenshtein(), varstr_sortsupport(), xid8out(), xidout(), XLogInsertRecord(), XLogReadRecordAlloc(), xml_recv(), xpath_string(), xpath_table(), yyalloc(), and yyrealloc().

◆ palloc0()

void * palloc0 ( Size  size)

Definition at line 1417 of file mcxt.c.

1418{
1419 /* duplicates MemoryContextAllocZero to avoid increased overhead */
1420 void *ret;
1422
1423 Assert(MemoryContextIsValid(context));
1425
1426 context->isReset = false;
1427
1428 ret = context->methods->alloc(context, size, 0);
1429 /* We expect OOM to be handled by the alloc function */
1430 Assert(ret != NULL);
1431 VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1432
1433 MemSetAligned(ret, 0, size);
1434
1435 return ret;
1436}

References MemoryContextMethods::alloc, Assert, AssertNotInCriticalSection, CurrentMemoryContext, fb(), MemoryContextData::isReset, MemoryContextIsValid, MemSetAligned, MemoryContextData::methods, and VALGRIND_MEMPOOL_ALLOC.

Referenced by _bt_form_posting(), _bt_truncate(), _bt_unmark_keys(), _bt_update_posting(), _gin_build_tuple(), _ltq_extract_regex(), _ltree_extract_isparent(), _ltree_extract_risparent(), _ltxtq_extract_exec(), accum_sum_rescale(), add_column_to_pathtarget(), add_sp_item_to_pathtarget(), allocacl(), allocateReloptStruct(), AllocateSnapshotBuilder(), AlterObjectNamespace_internal(), AlterObjectOwner_internal(), AlterObjectRename_internal(), appendSCRAMKeysInfo(), array_cat(), array_get_slice(), array_in(), array_map(), array_recv(), array_replace_internal(), array_set_element(), array_set_slice(), array_to_tsvector(), BeginCopyFrom(), BeginCopyTo(), bernoulli_initsamplescan(), BipartiteMatch(), bit(), bit_in(), BlockRefTableEntryMarkBlockModified(), bloom_create(), bloom_init(), BloomFormTuple(), bms_add_range(), bms_make_singleton(), bpchar_name(), brin_bloom_opcinfo(), brin_form_placeholder_tuple(), brin_form_tuple(), brin_inclusion_opcinfo(), brin_minmax_multi_opcinfo(), brin_minmax_multi_union(), brin_minmax_opcinfo(), brin_new_memtuple(), brin_range_serialize(), bt_page_print_tuples(), build_expanded_ranges(), build_expr_data(), build_mvdependencies(), build_sorted_items(), buildint2vector(), buildNSItemFromLists(), buildNSItemFromTupleDesc(), buildoidvector(), calc_word_similarity(), circle_poly(), collect_visibility_data(), combo_init(), compact_palloc0(), compile_plperl_function(), compile_pltcl_function(), connect_pg_server(), construct_md_array(), copy_ltree(), create_array_envelope(), create_groupingsets_plan(), crosstab(), cryptohash_internal(), cube_a_f8(), cube_a_f8_f8(), cube_c_f8(), cube_c_f8_f8(), cube_enlarge(), cube_f8(), cube_f8_f8(), cube_inter(), cube_subset(), cube_union_v0(), cvt_text_name(), deparse_context_for_plan_tree(), dependencies_object_end(), do_analyze_rel(), dsm_impl_mmap(), EnumValuesCreate(), eqjoinsel(), ExecBuildGroupingEqual(), ExecBuildHash32Expr(), ExecBuildHash32FromAttrs(), ExecBuildParamSetEqual(), ExecEvalArrayExpr(), ExecEvalHashedScalarArrayOp(), ExecGrant_Relation(), ExecIndexBuildScanKeys(), ExecInitAppend(), ExecInitBitmapAnd(), ExecInitBitmapOr(), ExecInitExprRec(), ExecInitFunc(), ExecInitGenerated(), ExecInitIndexScan(), ExecInitJsonExpr(), ExecInitJunkFilterConversion(), ExecInitRangeTable(), ExecInitResultRelation(), ExecInitSetOp(), ExecInitSubscriptingRef(), ExecInitValuesScan(), expand_partitioned_rtentry(), expand_tuple(), expand_virtual_generated_columns(), ExplainCreateWorkersState(), extract_rollup_sets(), extract_variadic_args(), fetch_more_data(), fetch_remote_table_info(), fillFakeState(), find_window_functions(), findeq(), formrdesc(), g_intbig_consistent(), gather_merge_setup(), gbt_macad8_union(), gbt_macad_union(), gbt_num_bin_union(), gbt_num_compress(), gbt_var_key_copy(), gbt_var_node_truncate(), generate_base_implied_equalities_no_const(), get_crosstab_tuplestore(), get_matching_partitions(), get_relation_info(), GetAccessStrategyWithSize(), getColorInfo(), ginExtractEntries(), ginNewScanKey(), gist_indexsortbuild_levelstate_add(), grow_notnull_info(), heap_form_minimal_tuple(), heap_form_tuple(), heap_toast_insert_or_update(), heap_vacuum_rel(), hmac_init(), identify_join_columns(), init_returning_filter(), InitCatCache(), initHyperLogLog(), initSpGistState(), inittapes(), inline_function(), inner_subltree(), InstrAlloc(), int2vectorin(), interpret_function_parameter_list(), jsonb_exec_setup(), lca_inner(), leader_takeover_tapes(), leftmostvalue_name(), logicalrep_read_tuple(), ltree_concat(), ltree_picksplit(), ltree_union(), make_auth_token(), make_inh_translation_list(), make_multirange(), make_partitionedrel_pruneinfo(), make_setop_translation_list(), make_sort_input_target(), make_tsvector(), make_tuple_from_result_row(), make_tuple_indirect(), makeArrayResultArr(), MakeTupleTableSlot(), mergeruns(), minmax_multi_init(), MJExamineQuals(), mkVoidAffix(), multi_sort_init(), multirange_constructor2(), multirange_get_range(), multirange_intersect_internal(), multirange_minus_internal(), multirange_union(), nameconcatoid(), namein(), namerecv(), ndistinct_object_end(), new_intArrayType(), newNode(), newRegisNode(), oidvectorin(), ParallelSlotsSetup(), parse_lquery(), parse_ltree(), parse_tsquery(), pg_crypt(), pgoutput_truncate(), pgp_init(), plperl_modify_tuple(), plsample_func_handler(), pltcl_build_tuple_result(), PLy_modify_tuple(), poly_in(), poly_recv(), prepare_query_params(), PrepareForIncrementalBackup(), preparePresortedCols(), printtup_prepare_info(), pull_up_constant_function(), pull_up_simple_subquery(), pull_up_simple_values(), px_crypt_shacrypt(), QTN2QT(), queryin(), range_agg_finalfn(), range_serialize(), RelationBuildLocalRelation(), ReorderBufferProcessTXN(), ReorderBufferToastReplace(), reverse_name(), rewriteTargetListIU(), rewriteValuesRTE(), serialize_prepare_info(), set_append_rel_size(), set_deparse_for_query(), set_join_column_names(), set_plan_references(), set_simple_column_names(), set_subquery_pathlist(), SetExplainExtensionState(), SnapBuildSerialize(), spgFormInnerTuple(), spgFormLeafTuple(), spgFormNodeTuple(), spgist_name_leaf_consistent(), standard_join_search(), statext_dependencies_build(), statext_dependencies_deserialize(), statext_dependencies_serialize(), statext_mcv_build(), statext_mcv_deserialize(), statext_mcv_serialize(), statext_ndistinct_deserialize(), test_create(), testdelete(), text_name(), toast_flatten_tuple_to_datum(), transformFromClauseItem(), transformSetOperationStmt(), transformValuesClause(), transformWithClause(), tsqueryrecv(), tsvector_concat(), tsvector_delete_arr(), tsvector_delete_by_indices(), tsvector_filter(), tsvector_strip(), tsvectorin(), tsvectorrecv(), TupleDescGetAttInMetadata(), tuplesort_begin_cluster(), tuplesort_begin_heap(), tuplesort_begin_index_btree(), tuplesort_begin_index_gin(), tuplesort_begin_index_gist(), vacuum_all_databases(), and varbit_in().

◆ palloc_aligned()

void * palloc_aligned ( Size  size,
Size  alignto,
int  flags 
)

Definition at line 1606 of file mcxt.c.

1607{
1609}

References CurrentMemoryContext, fb(), and MemoryContextAllocAligned().

Referenced by _mdfd_getseg(), GenericXLogStart(), InitCatCache(), and modify_rel_block().

◆ palloc_extended()

void * palloc_extended ( Size  size,
int  flags 
)

Definition at line 1439 of file mcxt.c.

1440{
1441 /* duplicates MemoryContextAllocExtended to avoid increased overhead */
1442 void *ret;
1444
1445 Assert(MemoryContextIsValid(context));
1447
1448 context->isReset = false;
1449
1450 ret = context->methods->alloc(context, size, flags);
1451 if (unlikely(ret == NULL))
1452 {
1453 /* NULL can be returned only when using MCXT_ALLOC_NO_OOM */
1454 Assert(flags & MCXT_ALLOC_NO_OOM);
1455 return NULL;
1456 }
1457
1458 VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1459
1460 if ((flags & MCXT_ALLOC_ZERO) != 0)
1461 MemSetAligned(ret, 0, size);
1462
1463 return ret;
1464}

References MemoryContextMethods::alloc, Assert, AssertNotInCriticalSection, CurrentMemoryContext, fb(), MemoryContextData::isReset, MCXT_ALLOC_NO_OOM, MCXT_ALLOC_ZERO, MemoryContextIsValid, MemSetAligned, MemoryContextData::methods, unlikely, and VALGRIND_MEMPOOL_ALLOC.

Referenced by AllocDeadEndChild(), apw_dump_now(), pg_clean_ascii(), and XLogReaderAllocate().

◆ pchomp()

◆ pfree()

void pfree ( void pointer)

Definition at line 1616 of file mcxt.c.

1617{
1618#ifdef USE_VALGRIND
1619 MemoryContext context = GetMemoryChunkContext(pointer);
1620#endif
1621
1622 MCXT_METHOD(pointer, free_p) (pointer);
1623
1624 VALGRIND_MEMPOOL_FREE(context, pointer);
1625}

References GetMemoryChunkContext(), MCXT_METHOD, and VALGRIND_MEMPOOL_FREE.

Referenced by _brin_parallel_merge(), _bt_array_decrement(), _bt_array_increment(), _bt_array_set_low_or_high(), _bt_bottomupdel_pass(), _bt_buildadd(), _bt_dedup_finish_pending(), _bt_dedup_pass(), _bt_delitems_delete(), _bt_delitems_delete_check(), _bt_delitems_vacuum(), _bt_doinsert(), _bt_findsplitloc(), _bt_freestack(), _bt_getroot(), _bt_gettrueroot(), _bt_insert_parent(), _bt_insertonpg(), _bt_load(), _bt_newlevel(), _bt_parallel_restore_arrays(), _bt_pendingfsm_finalize(), _bt_preprocess_array_keys(), _bt_simpledel_pass(), _bt_skiparray_set_element(), _bt_skiparray_set_isnull(), _bt_sort_dedup_finish_pending(), _bt_split(), _bt_spooldestroy(), _bt_truncate(), _bt_unmark_keys(), _bt_uppershutdown(), _fdvec_resize(), _gin_build_tuple(), _gin_process_worker_data(), _h_spooldestroy(), _hash_splitbucket(), _hash_squeezebucket(), _int_contains(), _int_inter(), _int_overlap(), _int_same(), _int_union(), _lca(), _mdfd_getseg(), AbsorbSyncRequests(), accum_sum_rescale(), accumArrayResultArr(), aclmerge(), add_partial_path(), add_path(), addArcs(), AddEnumLabel(), AddFileToBackupManifest(), addFkRecurseReferenced(), addHLParsedLex(), addItemPointersToLeafTuple(), addKey(), adjust_appendrel_attrs_multilevel(), adjust_child_relids_multilevel(), advance_windowaggregate(), advance_windowaggregate_base(), afterTriggerDeleteHeadEventChunk(), AfterTriggerEndSubXact(), afterTriggerFreeEventList(), afterTriggerRestoreEventList(), agg_refill_hash_table(), AlignedAllocFree(), AlignedAllocRealloc(), allocate_recordbuf(), AlterObjectNamespace_internal(), AlterObjectOwner_internal(), AlterObjectRename_internal(), appendJSONKeyValueFmt(), appendSCRAMKeysInfo(), AppendStringCommandOption(), appendStringInfoStringQuoted(), apply_scanjoin_target_to_paths(), apw_dump_now(), array_free_iterator(), array_in(), array_map(), array_out(), array_recv(), array_replace_internal(), array_reverse_n(), array_send(), array_set_element_expanded(), array_shuffle_n(), array_to_json_internal(), array_to_jsonb_internal(), array_to_text_internal(), arrayconst_cleanup_fn(), arrayexpr_cleanup_fn(), ArrayGetIntegerTypmods(), ASN1_STRING_to_text(), assign_simple_var(), AssignTransactionId(), astreamer_extractor_free(), astreamer_plain_writer_free(), astreamer_recovery_injector_free(), astreamer_tar_archiver_free(), astreamer_tar_parser_free(), astreamer_tar_terminator_free(), astreamer_verify_free(), Async_Notify(), AtEOSubXact_Inval(), AtEOSubXact_on_commit_actions(), AtEOSubXact_PgStat(), AtEOSubXact_PgStat_DroppedStats(), AtEOSubXact_PgStat_Relations(), AtEOXact_GUC(), AtEOXact_on_commit_actions(), AtEOXact_PgStat_DroppedStats(), AtEOXact_RelationCache(), ATPrepAlterColumnType(), AtSubAbort_childXids(), AtSubAbort_Notify(), AtSubAbort_Snapshot(), AtSubCommit_childXids(), AtSubCommit_Notify(), AttrDefaultFetch(), autoinc(), BackendInitialize(), bbsink_server_begin_archive(), bbsink_server_begin_manifest(), bbsink_server_end_manifest(), be_tls_close(), be_tls_open_server(), binaryheap_free(), bind_param_error_callback(), BipartiteMatchFree(), blendscan(), blgetbitmap(), BlockRefTableEntryMarkBlockModified(), BlockRefTableFreeEntry(), BlockRefTableReaderNextRelation(), bloom_free(), blrescan(), bms_add_members(), bms_del_member(), bms_del_members(), bms_free(), bms_int_members(), bms_intersect(), bms_join(), bms_replace_members(), boolop(), BootstrapModeMain(), bottomup_sort_and_shrink(), bpcharfastcmp_c(), bpcharrecv(), bqarr_in(), brin_bloom_union(), brin_build_desc(), brin_form_tuple(), brin_free_tuple(), brin_inclusion_add_value(), brin_inclusion_union(), brin_minmax_add_value(), brin_minmax_multi_distance_inet(), brin_minmax_multi_union(), brin_minmax_union(), brin_page_items(), brinendscan(), brininsertcleanup(), brinRevmapTerminate(), brinsummarize(), bt_check_level_from_leftmost(), bt_child_check(), bt_child_highkey_check(), bt_downlink_missing_check(), bt_leftmost_ignoring_half_dead(), bt_normalize_tuple(), bt_page_print_tuples(), bt_right_page_check_scankey(), bt_rootdescend(), bt_target_page_check(), bt_tuple_present_callback(), btendscan(), btinsert(), btree_xlog_updates(), btvacuumpage(), buf_finalize(), BufferSync(), BufFileClose(), BufFileOpenFileSet(), build_child_join_sjinfo(), build_EvalXFuncInt(), build_index_paths(), build_local_reloptions(), build_mvdependencies(), build_mvndistinct(), build_pertrans_for_aggref(), build_reloptions(), build_sorted_items(), buildFreshLeafTuple(), BuildRestoreCommand(), BuildTupleFromCStrings(), bytea_abbrev_convert(), byteafastcmp(), cache_single_string(), cached_function_compile(), calc_arraycontsel(), calc_distr(), calc_rank_and(), calc_rank_cd(), calc_rank_or(), calc_word_similarity(), calculate_partition_bound_for_merge(), cancel_on_dsm_detach(), casefold(), cash_words(), CatalogCloseIndexes(), CatCacheFreeKeys(), CatCacheRemoveCList(), CatCacheRemoveCTup(), char2wchar(), check_application_name(), check_circularity(), check_cluster_name(), check_control_files(), check_createrole_self_grant(), check_datestyle(), check_db_file_conflict(), check_debug_io_direct(), check_default_text_search_config(), check_ident_usermap(), check_locale(), check_log_connections(), check_log_destination(), check_oauth_validator(), check_partitions_for_split(), check_publications(), check_publications_origin_sequences(), check_publications_origin_tables(), check_relation_privileges(), check_restrict_nonsystem_relation_kind(), check_schema_perms(), check_search_path(), check_synchronized_standby_slots(), check_temp_tablespaces(), check_timezone(), check_wal_consistency_checking(), CheckAffix(), CheckAlterSubOption(), checkclass_str(), checkcondition_str(), CheckForBufferLeaks(), CheckForLocalBufferLeaks(), CheckIndexCompatible(), CheckMD5Auth(), CheckNNConstraintFetch(), CheckPasswordAuth(), CheckPointTwoPhase(), CheckPWChallengeAuth(), CheckRADIUSAuth(), CheckSASLAuth(), checkSharedDependencies(), choose_plan_name(), ChooseConstraintName(), ChooseExtendedStatisticName(), ChooseRelationName(), citext_eq(), citext_hash(), citext_hash_extended(), citext_ne(), citextcmp(), clauselist_apply_dependencies(), clauselist_selectivity_ext(), clean_NOT_intree(), clean_stopword_intree(), cleanup_directories_atexit(), cleanup_subxact_info(), clear_and_pfree(), close_tsvector_parser(), ClosePostmasterPorts(), collectMatchBitmap(), combo_free(), combo_init(), CompactCheckpointerRequestQueue(), compareJsonbContainers(), compareStrings(), compile_plperl_function(), compile_pltcl_function(), compileTheLexeme(), compileTheSubstitute(), compute_array_stats(), compute_tsvector_stats(), concat_internal(), connect_pg_server(), construct_empty_expanded_array(), convert_any_priv_string(), convert_charset(), convert_column_name(), convert_string_datum(), convert_to_scalar(), convertPgWchar(), copy_connection(), copy_dest_destroy(), copy_file(), copy_table(), CopyArrayEls(), CopyFromErrorCallback(), CopyFromTextLikeOneRow(), CopyMultiInsertBufferCleanup(), copyTemplateDependencies(), core_yyfree(), count_usable_fds(), create_cursor(), create_hash_bounds(), create_list_bounds(), create_partitionwise_grouping_paths(), create_range_bounds(), create_script_for_old_cluster_deletion(), create_secmsg(), create_tablespace_directories(), CreateCheckPoint(), CreateDatabaseUsingFileCopy(), CreateDatabaseUsingWalLog(), createdb(), createPostingTree(), CreateStatistics(), CreateTableSpace(), CreateTriggerFiringOn(), croak_cstr(), crosstab(), cstr2sv(), datetime_format_has_tz(), datetime_to_char_body(), datum_image_eq(), datum_image_hash(), datum_to_json_internal(), datumSerialize(), db_encoding_convert(), dbase_redo(), DCH_to_char(), deallocate_query(), DecodeTextArrayToBitmapset(), DeconstructFkConstraintRow(), DefineDomain(), DefineEnum(), DefineRange(), DefineType(), deleteSplitPartitionContext(), deparseConst(), dependencies_clauselist_selectivity(), DependencyGenerator_free(), deserialize_deflist(), destroy_tablespace_directories(), DestroyBlockRefTableReader(), DestroyBlockRefTableWriter(), DestroyParallelContext(), destroyStringInfo(), DestroyTupleQueueReader(), detoast_attr(), detoast_attr_slice(), digest_free(), dintdict_lexize(), dir_realloc(), dispell_init(), dispell_lexize(), div_var(), do_analyze_rel(), do_autovacuum(), Do_MultiXactIdWait(), do_pg_backup_start(), do_pg_backup_stop(), do_text_output_multiline(), do_to_timestamp(), DoesMultiXactIdConflict(), dofindsubquery(), dotrim(), DropRelationFiles(), DropRelationsAllBuffers(), dsa_detach(), dshash_destroy(), dshash_detach(), dsimple_lexize(), dsm_create(), dsm_detach(), dsm_impl_sysv(), dsnowball_lexize(), dsynonym_init(), dsynonym_lexize(), dxsyn_lexize(), ecpg_filter_source(), ecpg_filter_stderr(), ecpg_postprocess_result(), elog_node_display(), emit_audit_message(), encrypt_free(), end_tup_output(), EndCopy(), EndCopyFrom(), enlarge_list(), entry_dealloc(), entry_purge_tuples(), entryLoadMoreItems(), enum_range_internal(), enum_recv(), EnumValuesCreate(), eqjoinsel(), escape_json_text(), eval_windowaggregates(), EventTriggerAlterTableEnd(), EventTriggerSQLDropAddObject(), examine_attribute(), examine_attribute(), examine_expression(), exec_bind_message(), exec_command_conninfo(), exec_command_unrestrict(), exec_object_restorecon(), exec_stmt_foreach_a(), ExecAggCopyTransValue(), ExecDropSingleTupleTableSlot(), ExecEndWindowAgg(), ExecEvalPreOrderedDistinctSingle(), ExecEvalXmlExpr(), ExecFetchSlotHeapTupleDatum(), ExecForceStoreHeapTuple(), ExecForceStoreMinimalTuple(), ExecGrant_Attribute(), ExecGrant_common(), ExecGrant_Largeobject(), ExecGrant_Parameter(), ExecGrant_Relation(), ExecHashIncreaseNumBatches(), ExecHashRemoveNextSkewBucket(), ExecHashTableDestroy(), ExecIndexBuildScanKeys(), ExecInitGenerated(), ExecInitHashJoin(), ExecInitMemoize(), ExecParallelCleanup(), ExecParallelFinish(), ExecParallelHashCloseBatchAccessors(), ExecParallelHashRepartitionRest(), ExecReScanTidScan(), ExecResetTupleTable(), ExecSetParamPlan(), ExecSetSlotDescriptor(), ExecShutdownGatherMergeWorkers(), ExecShutdownGatherWorkers(), execute_foreign_modify(), executeDateTimeMethod(), executeItemOptUnwrapTarget(), ExecuteRecoveryCommand(), expand_dynamic_library_name(), expanded_record_set_field_internal(), expanded_record_set_fields(), expanded_record_set_tuple(), ExplainFlushWorkersState(), ExplainProperty(), ExplainPropertyFloat(), ExplainPropertyList(), ExplainQuery(), extract_autovac_opts(), extract_rollup_sets(), fetch_finfo_record(), fetch_function_defaults(), fetch_relation_list(), fetch_remote_slots(), fetch_remote_table_info(), fetch_statentries_for_relation(), file_acquire_sample_rows(), filter_list_to_array(), finalize_aggregates(), FinalizeIncrementalManifest(), find_in_path(), find_in_paths(), find_inheritance_children_extended(), find_other_exec(), find_provider(), findDependentObjects(), findeq(), findJsonbValueFromContainer(), finish_edata(), FinishPreparedTransaction(), fix_merged_indexes(), fixup_inherited_columns(), flush_pipe_input(), FlushRelationsAllBuffers(), fmgr_info_C_lang(), fmgr_info_cxt_security(), ForgetBackgroundWorker(), ForgetManyTestResources(), form_and_insert_tuple(), form_and_spill_tuple(), free_attrmap(), free_attstatsslot(), free_child_join_sjinfo(), free_chromo(), free_conversion_map(), free_edge_table(), free_object_addresses(), free_openssl_cipher(), free_openssl_digest(), free_parsestate(), free_partition_map(), free_pool(), free_sort_tuple(), FreeAccessStrategy(), freeAndGetParent(), FreeBulkInsertState(), FreeConfigVariable(), FreeErrorData(), FreeErrorDataContents(), FreeExprContext(), FreeFakeRelcacheEntry(), freeGinBtreeStack(), freeHyperLogLog(), FreeOldMultiXactReader(), FreeQueryDesc(), FreeSnapshot(), FreeSubscription(), freetree(), FreeTriggerDesc(), FreeTupleDesc(), FreeWaitEventSet(), FreeWaitEventSetAfterFork(), FreezeMultiXactId(), func_get_detail(), FuncnameGetCandidates(), g_int_compress(), g_int_consistent(), g_int_decompress(), g_int_penalty(), g_int_picksplit(), g_intbig_consistent(), g_intbig_picksplit(), gather_merge_clear_tuples(), gbt_bit_l2n(), gen_ossl_free(), generate_append_tlist(), generate_base_implied_equalities_no_const(), generate_combinations(), generate_dependencies(), generate_error_response(), generate_matching_part_pairs(), generate_trgm_only(), generate_wildcard_trgm(), generateClonedExtStatsStmt(), generateHeadline(), generator_free(), GenericXLogAbort(), GenericXLogFinish(), get_attstatsslot(), get_const_expr(), get_control_dbstate(), get_docrep(), get_extension_aux_control_filename(), get_extension_control_directories(), get_extension_script_filename(), get_flush_position(), get_from_clause(), get_relation_statistics(), get_reloptions(), get_sql_insert(), get_sql_update(), get_str_from_var_sci(), get_target_list(), get_tuple_of_interest(), get_typdefault(), GetAggInitVal(), GetAggInitVal(), GetAggInitVal(), getColorInfo(), GetConfFilesInDir(), getFileContentType(), GetMultiXactIdHintBits(), getNextNearest(), getObjectDescription(), getObjectIdentityParts(), getPublicationSchemaInfo(), GetTempNamespaceProcNumber(), GetWALRecordsInfo(), GetWalStats(), gin_check_parent_keys_consistency(), gin_check_posting_tree_parent_keys_consistency(), gin_extract_jsonb_path(), gin_leafpage_items(), gin_trgm_triconsistent(), GinBufferFree(), GinBufferReset(), GinBufferStoreTuple(), ginCompressPostingList(), ginendscan(), ginEntryFillRoot(), ginEntryInsert(), ginExtractEntries(), ginFinishSplit(), ginFlushBuildState(), GinFormTuple(), ginFreeScanKeys(), ginNewScanKey(), ginPostingListDecodeAllSegmentsToTbm(), ginVacuumEntryPage(), ginVacuumPostingTree(), ginVacuumPostingTreeLeaf(), gist_indexsortbuild(), gist_indexsortbuild_levelstate_flush(), gist_ischild(), gistgetbitmap(), gistgettuple(), gistPopItupFromNodeBuffer(), gistRelocateBuildBuffersOnSplit(), gistrescan(), gistunionsubkeyvec(), gistUnloadNodeBuffer(), group_similar_or_args(), gtrgm_consistent(), gtrgm_distance(), gtrgm_penalty(), gtsvector_penalty(), guc_free(), GUCArrayReset(), hash_record(), hash_record_extended(), hashagg_finish_initial_spills(), hashagg_reset_spill_state(), hashagg_spill_finish(), hashagg_spill_tuple(), hashbpchar(), hashbpcharextended(), hashbuildCallback(), hashendscan(), hashinsert(), hashtext(), hashtextextended(), heap_create_with_catalog(), heap_endscan(), heap_force_common(), heap_free_minimal_tuple(), heap_freetuple(), heap_lock_tuple(), heap_lock_updated_tuple_rec(), heap_modify_tuple(), heap_modify_tuple_by_cols(), heap_tuple_infomask_flags(), heap_tuple_should_freeze(), heap_vacuum_rel(), heapam_index_fetch_end(), heapam_relation_copy_for_cluster(), heapam_tuple_complete_speculative(), heapam_tuple_insert(), heapam_tuple_insert_speculative(), heapam_tuple_update(), hmac_finish(), hmac_free(), hmac_init(), hstoreUniquePairs(), hv_fetch_string(), hv_store_string(), icu_language_tag(), index_compute_xid_horizon_for_tuples(), index_concurrently_create_copy(), index_form_tuple_context(), index_truncate_tuple(), IndexScanEnd(), infix(), infix(), infix(), initcap(), InitExecPartitionPruneContexts(), initialize_reloptions(), InitializeSystemUser(), InitPostgres(), initTrie(), InitWalRecovery(), inner_int_inter(), insert_username(), InsertOneTuple(), InsertPgAttributeTuples(), internal_citext_pattern_cmp(), internalerrquery(), intorel_destroy(), intset_subtract(), inv_close(), inv_getsize(), inv_read(), inv_truncate(), inv_write(), InvalidateAttoptCacheCallback(), InvalidateTableSpaceCacheCallback(), irbt_free(), isAnyTempNamespace(), isolation_start_test(), iterate_jsonb_values(), iterate_word_similarity(), jit_release_context(), json_manifest_finalize_file(), json_manifest_finalize_wal_range(), json_manifest_object_field_start(), json_manifest_scalar(), json_object(), json_object_keys(), json_object_two_arg(), json_parse_manifest_incremental_shutdown(), json_unique_object_end(), json_unique_object_field_start(), jsonb_object(), jsonb_object_two_arg(), jsonb_send(), jsonb_set_element(), JsonbDeepContains(), JsonbValue_to_SV(), JsonItemFromDatum(), jsonpath_send(), jsonpath_yyfree(), KnownAssignedXidsDisplay(), lazy_cleanup_one_index(), lazy_vacuum_one_index(), lca(), leafRepackItems(), libpq_destroy(), libpqrcv_alter_slot(), libpqrcv_connect(), libpqrcv_create_slot(), libpqrcv_disconnect(), libpqrcv_get_option_from_conninfo(), libpqrcv_startstreaming(), libpqsrv_PGresultSetParent(), libpqsrv_PQclear(), like_fixed_prefix(), like_fixed_prefix_ci(), list_delete_first_n(), list_delete_nth_cell(), list_free_private(), llvm_compile_module(), llvm_copy_attributes_at_index(), llvm_release_context(), llvm_resolve_symbol(), llvm_resolve_symbols(), lo_manage(), load_backup_manifest(), load_enum_cache_data(), load_external_function(), load_file(), load_libraries(), load_relcache_init_file(), local_destroy(), LockAcquireExtended(), log_status_format(), logfile_rotate_dest(), logical_heap_rewrite_flush_mappings(), logicalrep_relmap_free_entry(), logicalrep_write_tuple(), LogicalRepSyncSequences(), LogicalTapeClose(), LogicalTapeFreeze(), LogicalTapeRewindForRead(), LogicalTapeSetClose(), LogRecoveryConflict(), LogStandbySnapshot(), lookup_ts_config_cache(), lookup_var_attr_stats(), LookupGXact(), lower(), lquery_recv(), lquery_send(), lrq_free(), ltree_addtext(), ltree_picksplit(), ltree_prefix_eq_ci(), ltree_recv(), ltree_send(), ltree_textadd(), ltxtq_recv(), ltxtq_send(), lz4_compress_datum(), main(), main(), make_greater_string(), make_partition_pruneinfo(), make_partitionedrel_pruneinfo(), make_SAOP_expr(), make_scalar_key(), make_tsvector(), make_tuple_indirect(), makeArrayTypeName(), makeMultirangeConstructors(), map_sql_value_to_xml_value(), mark_hl_fragments(), MatchText(), MaybeRemoveOldWalSummaries(), mbuf_free(), mcelem_array_contained_selec(), mcelem_array_selec(), mcelem_tsquery_selec(), mcv_clause_selectivity_or(), mcv_get_match_bitmap(), mdcbuf_free(), merge_acl_with_grant(), merge_clump(), mergeruns(), mkANode(), moddatetime(), mode_final(), moveArrayTypeName(), movedb(), movedb_failure_callback(), mq_putmessage(), mul_var(), multirange_recv(), MultiXactIdExpand(), MultiXactIdGetUpdateXid(), MultiXactIdIsRunning(), mXactCachePut(), mxid_to_string(), namerecv(), next_field_expand(), NIImportAffixes(), NIImportDictionary(), NIImportOOAffixes(), NINormalizeWord(), NormalizeSubWord(), NUM_cache(), numeric_abbrev_convert(), numeric_fast_cmp(), numeric_float4(), numeric_float8(), numeric_poly_stddev_internal(), numeric_to_number(), numericvar_to_double_no_overflow(), object_aclmask_ext(), overexplain_alias(), overexplain_bitmapset(), overexplain_intlist(), pa_free_worker_info(), pa_launch_parallel_worker(), pad_eme_pkcs1_v15(), PageRestoreTempPage(), pagetable_free(), pair_encode(), pairingheap_free(), parallel_vacuum_end(), parallel_vacuum_init(), parallel_vacuum_process_one_index(), ParameterAclLookup(), parse_and_validate_value(), parse_args(), parse_compress_specification(), parse_extension_control_file(), parse_fcall_arguments(), parse_hba_line(), parse_lquery(), parse_ltree(), parse_manifest_file(), parse_one_reloption(), parse_subscription_options(), parse_tsquery(), parseCommandLine(), ParseConfigFile(), ParseConfigFp(), parseNameAndArgTypes(), parseRelOptionsInternal(), parsetext(), patternsel_common(), pclose_check(), perform_base_backup(), perform_work_item(), PerformAuthentication(), PerformRadiusTransaction(), PerformWalRecovery(), pg_armor(), pg_attribute_aclcheck_all_ext(), pg_attribute_aclmask_ext(), pg_backup_stop(), pg_be_scram_build_secret(), pg_class_aclmask_ext(), pg_convert(), pg_crypt(), pg_dearmor(), pg_decode_commit_txn(), pg_decode_stream_abort(), pg_decode_stream_commit(), pg_encrypt(), pg_extension_update_paths(), pg_get_constraintdef_worker(), pg_get_expr_worker(), pg_get_function_arg_default(), pg_get_indexdef_worker(), pg_get_line(), pg_get_multixact_members(), pg_get_partkeydef_worker(), pg_get_statisticsobj_worker(), pg_get_statisticsobjdef_expressions(), pg_get_wal_block_info(), pg_get_wal_record_info(), pg_identify_object_as_address(), pg_largeobject_aclmask_snapshot(), pg_namespace_aclmask_ext(), pg_parameter_acl_aclmask(), pg_parameter_aclmask(), pg_parse_query(), pg_plan_query(), pg_replication_origin_create(), pg_replication_origin_drop(), pg_replication_origin_oid(), pg_replication_origin_session_setup(), pg_rewrite_query(), pg_split_opts(), pg_stat_file(), pg_stat_get_activity(), pg_stat_get_backend_activity(), pg_stat_statements_internal(), pg_sync_replication_slots(), pg_tablespace_databases(), pg_type_aclmask_ext(), pg_tzenumerate_end(), pg_tzenumerate_next(), pgfnames_cleanup(), pglz_compress_datum(), pgoutput_commit_txn(), pgp_cfb_free(), pgp_create_pkt_reader(), pgp_free(), pgp_key_free(), pgp_mpi_free(), pgss_shmem_startup(), pgss_store(), pgstat_delete_pending_entry(), pgstat_release_entry_ref(), pkt_stream_free(), pktreader_free(), plainnode(), plperl_build_tuple_result(), plperl_call_perl_func(), plperl_hash_from_tuple(), plperl_modify_tuple(), plperl_spi_exec_prepared(), plperl_spi_prepare(), plperl_spi_query_prepared(), plperl_sv_to_datum(), plperl_trigger_handler(), plperl_util_elog(), plpgsql_compile_callback(), plpgsql_destroy_econtext(), plpgsql_extra_checks_check_hook(), plpgsql_subxact_cb(), pltcl_build_tuple_argument(), pltcl_func_handler(), pltcl_quote(), pltcl_set_tuple_values(), pltcl_trigger_handler(), PLy_abort_open_subtransactions(), PLy_elog_impl(), PLy_function_drop_args(), PLy_function_restore_args(), PLy_input_setup_tuple(), PLy_modify_tuple(), PLy_output(), PLy_output_setup_tuple(), PLy_pop_execution_context(), PLy_procedure_compile(), PLy_procedure_create(), PLy_quote_literal(), PLy_quote_nullable(), PLy_subtransaction_exit(), PLy_traceback(), PLy_trigger_build_args(), PLyGenericObject_ToComposite(), PLyMapping_ToComposite(), PLyNumber_ToJsonbValue(), PLySequence_ToComposite(), PLyUnicode_Bytes(), PLyUnicode_FromScalar(), PLyUnicode_FromStringAndSize(), PopActiveSnapshot(), PopTransaction(), populate_array(), populate_record(), populate_scalar(), PortalDrop(), postgresExecForeignTruncate(), postgresGetForeignJoinPaths(), PostmasterMain(), PostPrepare_smgr(), pprint(), pq_cleanup_redirect_to_shm_mq(), pq_endmessage(), pq_puttextmessage(), pq_sendcountedtext(), pq_sendstring(), pq_sendtext(), pq_writestring(), PrepareTempTablespaces(), preprocessNamespacePath(), PrescanPreparedTransactions(), print(), print_expr(), print_function_arguments(), printtup_destroy(), printtup_prepare_info(), printtup_shutdown(), ProcArrayApplyRecoveryInfo(), process_directory_recursively(), process_ordered_aggregate_single(), process_pipe_input(), process_postgres_switches(), process_rel_infos(), process_target_wal_block_change(), ProcessCommittedInvalidationMessages(), ProcessConfigFileInternal(), ProcessGUCArray(), ProcessParallelApplyMessages(), ProcessParallelMessages(), ProcessPgArchInterrupts(), ProcessStandbyHSFeedbackMessage(), ProcessStandbyReplyMessage(), ProcessStartupPacket(), ProcessWalSndrMessage(), ProcSleep(), prs_process_call(), prune_element_hashtable(), prune_lexemes_hashtable(), psprintf(), psql_add_command(), psql_start_test(), pullf_free(), pushf_free(), PushTransaction(), pushval_morph(), px_crypt_shacrypt(), px_find_cipher(), px_find_combo(), px_find_digest(), QTNFree(), QTNTernary(), queryin(), range_fast_cmp(), range_recv(), rbt_populate(), RE_compile(), RE_compile_and_cache(), RE_execute(), read_client_final_message(), read_dictionary(), read_stream_end(), ReadArrayStr(), readfile(), readstoplist(), recheck_relation_needs_vacanalyze(), reconstruct_from_incremental_file(), record_cmp(), record_eq(), record_image_cmp(), record_image_eq(), record_in(), record_out(), record_recv(), record_send(), recordMultipleDependencies(), RecordTransactionAbort(), RecordTransactionCommit(), RecoverPreparedTransactions(), recursive_revoke(), recv_password_packet(), regcomp_auth_token(), regex_fixed_prefix(), regexec_auth_token(), regexp_fixed_prefix(), regression_main(), RehashCatCache(), RehashCatCacheLists(), reindex_one_database(), ReinitializeParallelDSM(), RelationBuildPartitionKey(), RelationBuildPublicationDesc(), RelationBuildRowSecurity(), RelationBuildRuleLock(), RelationBuildTriggers(), RelationBuildTupleDesc(), RelationCacheInitializePhase3(), RelationDestroyRelation(), RelationGetDummyIndexExpressions(), RelationGetIndexAttOptions(), RelationGetIndexExpressions(), RelationGetIndexPredicate(), RelationInvalidateRelation(), RelationParseRelOptions(), RelationPreserveStorage(), RelationReloadIndexInfo(), ReleaseDummy(), ReleaseManyTestResource(), ReleasePostmasterChildSlot(), relmap_redo(), remove_cache_entry(), remove_dbtablespaces(), remove_leftjoinrel_from_query(), remove_self_join_rel(), RemoveLocalLock(), RenameTypeInternal(), ReorderBufferAddDistributedInvalidations(), ReorderBufferFreeChange(), ReorderBufferFreeRelids(), ReorderBufferFreeSnap(), ReorderBufferFreeTupleBuf(), ReorderBufferFreeTXN(), ReorderBufferIterTXNFinish(), ReorderBufferToastReplace(), ReorderBufferToastReset(), reorderqueue_pop(), replace_auto_config_value(), replace_text(), replace_text_regexp(), replication_scanner_finish(), ReplicationSlotDropAtPubNode(), ReplicationSlotRelease(), ReplicationSlotValidateName(), ReplSlotSyncWorkerMain(), report_corruption_internal(), report_triggers(), reportDependentObjects(), ReportGUCOption(), ReportSlotInvalidation(), reset_directory_cleanup_list(), reset_on_dsm_detach(), ResetDecoder(), resetSpGistScanOpaque(), resolve_aggregate_transtype(), ResourceOwnerDelete(), ResourceOwnerEnlarge(), ResourceOwnerReleaseAll(), RestoreArchivedFile(), RestoreArchivedFile(), rewriteTargetListIU(), rewriteValuesRTE(), rm_redo_error_callback(), rmtree(), RS_free(), RT_END_ITERATE(), RT_FREE(), RT_FREE_LEAF(), RT_FREE_NODE(), run_ssl_passphrase_command(), scanner_finish(), scanPendingInsert(), scram_verify_plain_password(), secure_open_server(), select_active_windows(), select_outer_pathkeys_for_merge(), send_message_to_frontend(), send_message_to_server_log(), sendDir(), SendFunctionResult(), sepgsql_attribute_drop(), sepgsql_attribute_post_create(), sepgsql_attribute_relabel(), sepgsql_attribute_setattr(), sepgsql_avc_check_perms(), sepgsql_avc_compute(), sepgsql_avc_reclaim(), sepgsql_database_drop(), sepgsql_database_post_create(), sepgsql_database_relabel(), sepgsql_database_setattr(), sepgsql_proc_drop(), sepgsql_proc_execute(), sepgsql_proc_post_create(), sepgsql_proc_relabel(), sepgsql_proc_setattr(), sepgsql_relation_drop(), sepgsql_relation_post_create(), sepgsql_relation_relabel(), sepgsql_relation_setattr(), sepgsql_relation_truncate(), sepgsql_schema_drop(), sepgsql_schema_post_create(), sepgsql_schema_relabel(), sepgsql_xact_callback(), seq_redo(), seq_search_localized(), serialize_deflist(), serialize_prepare_info(), serializeAnalyzeDestroy(), serializeAnalyzeShutdown(), set_append_rel_size(), set_customscan_references(), set_foreignscan_references(), set_indexonlyscan_references(), set_join_references(), set_plan_refs(), set_returning_clause_references(), set_subquery_pathlist(), set_upper_references(), set_var_from_str(), set_windowagg_runcondition_references(), SetClientEncoding(), setCorrLex(), setNewTmpRes(), setup_regexp_matches(), setup_test_matches(), shdepLockAndCheckObject(), shell_archive_file(), shell_finish_command(), shm_mq_detach(), shm_mq_receive(), show_memoize_info(), show_trgm(), show_window_def(), show_window_keys(), ShowAllGUCConfig(), ShowTransactionStateRec(), ShowUsage(), ShutdownExprContext(), ShutdownWalRecovery(), similarity(), single_encode(), slotsync_reread_config(), smgr_bulk_flush(), smgrDoPendingDeletes(), smgrDoPendingSyncs(), smgrdounlinkall(), SnapBuildFreeSnapshot(), SnapBuildPurgeOlderTxn(), SnapBuildRestore(), SnapBuildSerialize(), spg_box_quad_inner_consistent(), spgClearPendingList(), spgdoinsert(), spgendscan(), spgFreeSearchItem(), spggettuple(), spgRedoVacuumRedirect(), SPI_cursor_open(), SPI_modifytuple(), SPI_pfree(), split_text(), SplitIdentifierString(), SplitToVariants(), sqlfunction_destroy(), StandbyRecoverPreparedTransactions(), StandbyTransactionIdIsPrepared(), start_table_sync(), StartPrepare(), startScanEntry(), StartupRereadConfig(), StartupXLOG(), statatt_build_stavalues(), statext_dependencies_free(), statext_mcv_build(), statext_mcv_deserialize(), statext_mcv_free(), statext_mcv_serialize(), statext_ndistinct_free(), StoreAttrDefault(), storeObjectDescription(), StorePartitionKey(), StoreRelCheck(), storeRow(), string_to_text(), stringToQualifiedNameList(), strlower_libc_mb(), strncoll_libc(), strnxfrm_libc(), strtitle_libc_mb(), strupper_libc_mb(), sts_end_write(), sts_read_tuple(), SummarizeWAL(), sync_queue_destroy(), SyncPostCheckpoint(), syncrep_scanner_finish(), SyncRepGetNthLatestSyncRecPtr(), SyncRepGetSyncRecPtr(), SysLogger_Start(), SysLoggerMain(), systable_beginscan(), systable_beginscan_ordered(), systable_endscan(), systable_endscan_ordered(), table_recheck_autovac(), tablesample_init(), TablespaceCreateDbspace(), tbm_end_private_iterate(), tbm_end_shared_iterate(), tbm_free(), terminate_brin_buildstate(), test_basic(), test_bms_overlap_list(), test_custom_stats_var_from_serialized_data(), test_destroy(), test_enc_conversion(), test_protocol_version(), test_random(), test_random_operations(), test_re_compile(), test_shm_mq_setup(), test_singlerowmode(), testdelete(), testprs_end(), text2ltree(), text_format(), text_format_string_conversion(), text_substring(), text_to_cstring(), text_to_cstring_buffer(), textrecv(), textToQualifiedNameList(), thesaurus_lexize(), thesaurusRead(), TidListEval(), TidStoreDestroy(), TidStoreDetach(), TidStoreEndIterate(), toast_build_flattened_tuple(), toast_close_indexes(), toast_compress_datum(), toast_flatten_tuple(), toast_flatten_tuple_to_datum(), toast_tuple_cleanup(), toast_tuple_externalize(), toast_tuple_try_compression(), tokenize_auth_file(), tokenize_expand_file(), tokenize_include_file(), TParserClose(), TParserCopyClose(), TParserGet(), tqueueDestroyReceiver(), tqueueReceiveSlot(), TransformGUCArray(), transformRangeTableFunc(), transientrel_destroy(), try_partitionwise_join(), ts_accum(), TS_execute_locations_recurse(), ts_headline_byid_opt(), ts_headline_json_byid_opt(), ts_headline_jsonb_byid_opt(), ts_lexize(), ts_match_tq(), ts_match_tt(), ts_process_call(), ts_stat_sql(), tsearch_readline(), tsearch_readline_end(), tsquery_rewrite_query(), tsqueryrecv(), tsquerytree(), tstoreDestroyReceiver(), tstoreReceiveSlot_detoast(), tstoreShutdownReceiver(), tsvector_delete_arr(), tsvector_to_array(), tsvector_update_trigger(), tsvectorin(), tt_process_call(), tts_virtual_clear(), tuple_data_split(), tuple_data_split_internal(), tuplesort_begin_batch(), tuplesort_begin_cluster(), tuplesort_begin_index_btree(), tuplestore_advance(), tuplestore_end(), tuplestore_skiptuples(), tuplestore_trim(), typeDepNeeded(), typenameTypeMod(), unaccent_dict(), uniqueentry(), uniqueWORD(), unistr(), UnregisterExprContextCallback(), UnregisterResourceReleaseCallback(), UnregisterSubXactCallback(), UnregisterXactCallback(), updateAclDependenciesWorker(), UpdateIndexRelation(), UpdateLogicalMappings(), upper(), uuid_decrement(), uuid_increment(), vac_close_indexes(), validate(), validate_remote_info(), varcharrecv(), varlenafastcmp_locale(), varstr_abbrev_convert(), varstrfastcmp_c(), verify_backup_checksums(), verify_cb(), verify_control_file(), verify_plain_backup_directory(), verify_tar_backup(), wait_for_connection_state(), WaitForOlderSnapshots(), WaitForParallelWorkersToExit(), walrcv_clear_result(), WalRcvFetchTimeLineHistoryFiles(), WalReceiverMain(), worker_freeze_result_tape(), write_auto_conf_file(), write_console(), write_csvlog(), write_jsonlog(), write_reconstructed_file(), X509_NAME_field_to_text(), X509_NAME_to_cstring(), XLogDecodeNextRecord(), XLogDumpDisplayRecord(), XLogInsertRecord(), XLogPrefetcherFree(), XLogReaderAllocate(), XLogReaderFree(), XLogReleasePreviousRecord(), XLOGShmemInit(), xml_encode_special_chars(), xml_out_internal(), xml_recv(), xml_send(), xmlconcat(), xmlpi(), xpath_bool(), xpath_list(), xpath_nodeset(), xpath_number(), xpath_string(), xpath_table(), and yyfree().

◆ pnstrdup()

◆ ProcessLogMemoryContextInterrupt()

void ProcessLogMemoryContextInterrupt ( void  )

Definition at line 1340 of file mcxt.c.

1341{
1343
1344 /*
1345 * Exit immediately if memory context logging is already in progress. This
1346 * prevents recursive calls, which could occur if logging is requested
1347 * repeatedly and rapidly, potentially leading to infinite recursion and a
1348 * crash.
1349 */
1351 return;
1353
1354 PG_TRY();
1355 {
1356 /*
1357 * Use LOG_SERVER_ONLY to prevent this message from being sent to the
1358 * connected client.
1359 */
1361 (errhidestmt(true),
1362 errhidecontext(true),
1363 errmsg("logging memory contexts of PID %d", MyProcPid)));
1364
1365 /*
1366 * When a backend process is consuming huge memory, logging all its
1367 * memory contexts might overrun available disk space. To prevent
1368 * this, we limit the depth of the hierarchy, as well as the number of
1369 * child contexts to log per parent to 100.
1370 *
1371 * As with MemoryContextStats(), we suppose that practical cases where
1372 * the dump gets long will typically be huge numbers of siblings under
1373 * the same parent context; while the additional debugging value from
1374 * seeing details about individual siblings beyond 100 will not be
1375 * large.
1376 */
1378 }
1379 PG_FINALLY();
1380 {
1382 }
1383 PG_END_TRY();
1384}

References ereport, errhidecontext(), errhidestmt(), errmsg(), LOG_SERVER_ONLY, LogMemoryContextInProgress, LogMemoryContextPending, MemoryContextStatsDetail(), MyProcPid, PG_END_TRY, PG_FINALLY, PG_TRY, and TopMemoryContext.

Referenced by ProcessAutoVacLauncherInterrupts(), ProcessCheckpointerInterrupts(), ProcessInterrupts(), ProcessMainLoopInterrupts(), ProcessPgArchInterrupts(), ProcessStartupProcInterrupts(), and ProcessWalSummarizerInterrupts().

◆ pstrdup()

char * pstrdup ( const char in)

Definition at line 1781 of file mcxt.c.

1782{
1784}

References CurrentMemoryContext, and MemoryContextStrdup().

Referenced by AbsoluteConfigLocation(), accesstype_arg_to_string(), add_row_identity_var(), add_with_check_options(), addCompiledLexeme(), addFkConstraint(), addRangeTableEntryForFunction(), addRangeTableEntryForGroup(), addRangeTableEntryForSubquery(), addRangeTableEntryForTableFunc(), addRangeTableEntryForValues(), AddRelationNotNullConstraints(), addToResult(), allocate_reloption(), AllocSlruSegState(), AlterRole(), analyzeCTETargetList(), anytime_typmodout(), anytimestamp_typmodout(), append_database_pattern(), append_relation_pattern_helper(), append_schema_pattern(), ApplyRetrieveRule(), array_out(), astreamer_extractor_new(), astreamer_gzip_writer_new(), astreamer_plain_writer_new(), ATExecAddIndexConstraint(), ATExecAlterConstraint(), ATExecAlterConstrEnforceability(), ATParseTransformCmd(), BaseBackupAddTarget(), BeginCopyFrom(), BeginCopyTo(), BootstrapModeMain(), BufFileCreateFileSet(), BufFileOpenFileSet(), build_datatype(), build_minmax_path(), build_server_first_message(), buildDefItem(), BuildOnConflictExcludedTargetlist(), buildRelationAliases(), BuildRestoreCommand(), CatalogCacheInitializeCache(), check_createrole_self_grant(), check_datestyle(), check_debug_io_direct(), check_hostname(), check_locale(), check_log_connections(), check_log_destination(), check_oauth_validator(), check_restrict_nonsystem_relation_kind(), check_search_path(), check_selective_binary_conversion(), check_synchronized_standby_slots(), check_temp_tablespaces(), check_timezone(), check_tuple_header(), check_tuple_visibility(), check_valid_internal_signature(), check_wal_consistency_checking(), checkInsertTargets(), choose_plan_name(), ChooseExtendedStatisticNameAddition(), ChooseForeignKeyConstraintNameAddition(), ChooseIndexColumnNames(), ChooseIndexNameAddition(), CloneRowTriggersToPartition(), compile_database_list(), compile_plperl_function(), compile_pltcl_function(), compile_relation_list_one_db(), compileTheSubstitute(), connectby_text(), connectby_text_serial(), convert_GUC_name_for_parameter_acl(), convert_string_datum(), CopyCachedPlan(), CopyErrorData(), CopyLimitPrintoutLength(), CopyTriggerDesc(), copyTSLexeme(), CopyVar(), create_foreign_modify(), CreateCachedPlan(), CreateLockFile(), createNewConnection(), CreateParallelContext(), CreateSchemaCommand(), createTableConstraints(), CreateTableSpace(), CreateTupleDescCopyConstr(), cstring_in(), cstring_out(), datasegpath(), date_out(), dbase_redo(), defGetString(), DefineQueryRewrite(), DefineView(), DefineViewRules(), deleteConnection(), destroy_tablespace_directories(), DetachPartitionFinalize(), determineNotNullFlags(), determineRecursiveColTypes(), do_pg_backup_start(), DoCopy(), DropSubscription(), dsynonym_init(), ean13_out(), encrypt_password(), enum_out(), exec_bind_message(), exec_command_restrict(), exec_execute_message(), executeItemOptUnwrapTarget(), expand_dynamic_library_name(), expand_inherited_rtentry(), expand_insert_targetlist(), expand_single_inheritance_child(), ExpandRowReference(), expandRTE(), expandTableLikeClause(), expandTupleDesc(), ExportSnapshot(), extension_file_exists(), extract_slot_names(), ExtractExtensionList(), fetch_statentries_for_relation(), fill_hba_line(), filter_list_to_array(), find_in_paths(), find_plan(), flatten_set_variable_args(), float4in_internal(), float8in_internal(), fmgr_symbol(), format_operator_parts(), format_procedure_parts(), format_type_extended(), from_char_seq_search(), generate_append_tlist(), generate_setop_tlist(), generateClonedIndexStmt(), generateJsonTablePathName(), get_am_name(), get_attname(), get_collation(), get_collation_actual_version_libc(), get_collation_name(), get_configdata(), get_connect_string(), get_constraint_name(), get_database_list(), get_database_name(), get_ext_ver_info(), get_ext_ver_list(), get_extension_control_directories(), get_extension_name(), get_extension_script_directory(), get_file_fdw_attribute_options(), get_func_name(), get_language_name(), get_namespace_name(), get_namespace_name_or_temp(), get_opclass(), get_opfamily_name(), get_opname(), get_publication_name(), get_rel_name(), get_rolespec_name(), get_source_line(), get_sql_insert(), get_sql_update(), get_subscription_list(), get_subscription_name(), get_tablespace_location(), get_tablespace_name(), getAdditionalACLs(), getAttributesList(), GetConfFilesInDir(), GetConfigOptionValues(), getConnectionByName(), GetDatabasePath(), GetForeignDataWrapperExtended(), GetForeignServerExtended(), GetJsonBehaviorValueString(), getNamespaces(), getObjectIdentityParts(), getOpFamilyIdentity(), GetPublication(), getRecoveryStopReason(), getRelationIdentity(), getRelationStatistics(), GetSubscription(), getTokenTypes(), GetUserNameFromId(), GetWaitEventCustomNames(), gtsvectorout(), heap_vacuum_rel(), hstore_out(), ImportForeignSchema(), indent_lines(), injection_points_attach(), InjectionPointList(), internal_yylex(), interpret_AS_clause(), interpret_function_parameter_list(), interval_out(), isn_out(), iterate_values_object_field_start(), json_build_object_worker(), JsonbUnquote(), JsonTableInitOpaque(), lazy_cleanup_one_index(), lazy_vacuum_one_index(), libpqrcv_check_conninfo(), libpqrcv_create_slot(), libpqrcv_get_conninfo(), libpqrcv_get_option_from_conninfo(), libpqrcv_get_senderinfo(), libpqrcv_identify_system(), libpqrcv_readtimelinehistoryfile(), llvm_error_message(), llvm_function_reference(), llvm_set_target(), llvm_split_symbol_name(), load_domaintype_info(), load_libraries(), Lock_AF_UNIX(), logicalrep_partition_open(), logicalrep_read_attrs(), logicalrep_read_origin(), logicalrep_read_rel(), logicalrep_read_typ(), logicalrep_relmap_update(), LogicalRepSyncSequences(), main(), main(), make_rfile(), makeAlias(), makeColumnDef(), makeJsonTablePathSpec(), makeMultirangeTypeName(), map_sql_value_to_xml_value(), MarkGUCPrefixReserved(), MergeAttributes(), MergeCheckConstraint(), name_active_windows(), nameout(), network_out(), new_ExtensionControlFile(), NINormalizeWord(), NormalizeSubWord(), nullable_string(), numeric_normalize(), numeric_out(), numeric_out_sci(), oauth_exchange(), obtain_object_name_namespace(), okeys_object_field_start(), parallel_vacuum_main(), parallel_vacuum_process_one_index(), parse_compress_specification(), parse_extension_control_file(), parse_hba_auth_opt(), parse_hba_line(), parse_ident_line(), parse_output_parameters(), parse_publication_options(), parse_scram_secret(), parse_subscription_options(), ParseConfigFp(), ParseLongOption(), parseNameAndArgTypes(), ParseTzFile(), perform_base_backup(), PerformCursorOpen(), pg_available_extension_versions(), pg_available_extensions(), pg_import_system_collations(), pg_lsn_out(), pg_split_opts(), pg_split_walfile_name(), pg_tzenumerate_next(), pg_tzenumerate_start(), pgfnames(), pgrowlocks(), pgstatindex_impl(), plperl_init_interp(), plperl_to_hstore(), plpgsql_build_recfield(), plpgsql_build_record(), plpgsql_build_variable(), plpgsql_compile_callback(), plpgsql_compile_inline(), plpgsql_extra_checks_check_hook(), plsample_func_handler(), plsample_trigger_handler(), pltcl_set_tuple_values(), PLy_output(), PLy_procedure_create(), PLyObject_AsString(), PLyUnicode_AsString(), populate_scalar(), postgresImportForeignSchema(), PostmasterMain(), pq_parse_errornotice(), precheck_tar_backup_file(), prepare_foreign_modify(), prepare_sql_fn_parse_info(), PrepareTempTablespaces(), preprocess_targetlist(), preprocessNamespacePath(), print_function_sqlbody(), process_integer_literal(), process_psqlrc(), ProcessConfigFileInternal(), ProcessParallelApplyMessage(), ProcessParallelMessage(), ProcessPgArchInterrupts(), ProcessStandbyHSFeedbackMessage(), ProcessStandbyReplyMessage(), ProcessStartupPacket(), ProcessWalSndrMessage(), prsd_headline(), prsd_lextype(), pset_value_string(), px_find_combo(), QueueFKConstraintValidation(), QueueNNConstraintValidation(), range_deparse(), read_client_final_message(), read_client_first_message(), read_dictionary(), read_tablespace_map(), RebuildConstraintComment(), record_config_file_error(), regclassout(), regcollationout(), regconfigout(), regdatabaseout(), regdictionaryout(), register_label_provider(), regnamespaceout(), regoperatorout(), regoperout(), regprocedureout(), regprocout(), REGRESS_exec_check_perms(), REGRESS_object_access_hook_str(), REGRESS_utility_command(), regroleout(), regtypeout(), ReindexPartitions(), RelationBuildTriggers(), RelationGetNotNullConstraints(), RemoveInheritance(), ReorderBufferFinishPrepared(), ReorderBufferPrepare(), ReorderBufferQueueMessage(), replace_auto_config_value(), ReplicationSlotRelease(), ReThrowError(), rewriteTargetListIU(), rewriteTargetView(), rmtree(), scram_exchange(), sendDir(), sepgsql_avc_compute(), sepgsql_compute_create(), sepgsql_get_label(), sepgsql_mcstrans_in(), sepgsql_mcstrans_out(), sepgsql_set_client_label(), set_relation_column_names(), set_stream_options(), shell_archive_file(), shell_get_sink(), show_sort_group_keys(), ShowGUCOption(), slotsync_reread_config(), SPI_fname(), SPI_getrelname(), SPI_gettype(), SplitDirectoriesString(), splitTzLine(), StartupRereadConfig(), stringToQualifiedNameList(), strip_trailing_ws(), substitute_path_macro(), SysLoggerMain(), test_rls_hooks_permissive(), test_rls_hooks_restrictive(), testprs_lextype(), textToQualifiedNameList(), thesaurus_init(), throw_tcl_error(), ThrowErrorData(), tidout(), time_out(), timestamp_out(), timestamptz_out(), timetz_out(), tokenize_auth_file(), tokenize_expand_file(), transformFkeyGetPrimaryKey(), transformIndexConstraint(), transformJsonArrayQueryConstructor(), transformJsonTableColumn(), transformJsonTableColumns(), transformRangeTableFunc(), transformRowExpr(), transformSetOperationStmt(), transformTableLikeClause(), tsearch_readline(), typeTypeName(), unknownin(), unknownout(), utf_e2u(), utf_u2e(), validate_token(), verify_plain_backup_directory(), void_out(), wait_result_to_str(), worker_spi_main(), and X509_NAME_to_cstring().

◆ repalloc()

void * repalloc ( void pointer,
Size  size 
)

Definition at line 1632 of file mcxt.c.

1633{
1634#if defined(USE_ASSERT_CHECKING) || defined(USE_VALGRIND)
1635 MemoryContext context = GetMemoryChunkContext(pointer);
1636#endif
1637 void *ret;
1638
1640
1641 /* isReset must be false already */
1642 Assert(!context->isReset);
1643
1644 /*
1645 * For efficiency reasons, we purposefully offload the handling of
1646 * allocation failures to the MemoryContextMethods implementation as this
1647 * allows these checks to be performed only when an actual malloc needs to
1648 * be done to request more memory from the OS. Additionally, not having
1649 * to execute any instructions after this call allows the compiler to use
1650 * the sibling call optimization. If you're considering adding code after
1651 * this call, consider making it the responsibility of the 'realloc'
1652 * function instead.
1653 */
1654 ret = MCXT_METHOD(pointer, realloc) (pointer, size, 0);
1655
1656 VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size);
1657
1658 return ret;
1659}

References Assert, AssertNotInCriticalSection, GetMemoryChunkContext(), MemoryContextData::isReset, MCXT_METHOD, realloc, and VALGRIND_MEMPOOL_CHANGE.

Referenced by _bt_deadblocks(), _bt_pendingfsm_add(), _bt_preprocess_keys(), _fdvec_resize(), accumArrayResult(), accumArrayResultArr(), add_column_to_pathtarget(), add_exact_object_address(), add_exact_object_address_extra(), add_object_address(), add_reloption(), addCompiledLexeme(), addCompoundAffixFlagValue(), AddInvalidationMessage(), addlit(), addlitchar(), AddStem(), addToArray(), AfterTriggerBeginSubXact(), AfterTriggerEnlargeQueryState(), appendElement(), appendKey(), apply_spooled_messages(), array_agg_array_combine(), array_agg_combine(), array_set_element_expanded(), AtSubCommit_childXids(), BlockRefTableEntryMarkBlockModified(), bms_add_member(), bms_add_range(), bms_replace_members(), brin_copy_tuple(), BufferSync(), BufFileAppend(), checkSharedDependencies(), compileTheLexeme(), compileTheSubstitute(), CopyReadAttributesCSV(), CopyReadAttributesText(), core_yyrealloc(), count_usable_fds(), cube_inter(), do_set_block_offsets(), dsnowball_lexize(), dxsyn_lexize(), enlarge_list(), enlargeStringInfo(), enum_range_internal(), ExecIndexBuildScanKeys(), ExecInitPartitionDispatchInfo(), ExecInitRoutingInfo(), ExprEvalPushStep(), extendBufFile(), find_inheritance_children_extended(), find_plan(), findDependentObjects(), generate_dependencies_recurse(), generateHeadline(), get_docrep(), GetComboCommandId(), GetConfFilesInDir(), GetExplainExtensionId(), GetLockStatusData(), GetPlannerExtensionId(), GetSingleProcBlockerStatusData(), GinBufferStoreTuple(), GinFormTuple(), ginPostingListDecodeAllSegments(), gistAddLoadedBuffer(), gistBuffersReleaseBlock(), gistGetNodeBuffer(), gtsvector_compress(), hladdword(), hlfinditem(), icu_language_tag(), int2vectorin(), jsonpath_yyrealloc(), load_domaintype_info(), load_enum_cache_data(), load_relcache_init_file(), LockAcquireExtended(), lookup_type_cache(), ltree_prefix_eq_ci(), ltsGetPreallocBlock(), ltsReleaseBlock(), mark_hl_fragments(), MergeAffix(), multirange_in(), NIAddAffix(), NIAddSpell(), NISortAffixes(), oidvectorin(), oidvectortypes(), okeys_object_field_start(), parse_hstore(), parsetext(), perform_default_encoding_conversion(), pg_do_encoding_conversion(), pg_import_system_collations(), pgss_shmem_startup(), plainnode(), plpgsql_adddatum(), prepare_room(), PrescanPreparedTransactions(), prs_setup_firstcall(), pushval_asis(), pushValue(), record_corrupt_item(), RecordConstLocation(), RegisterExtensionExplainOption(), RelationBuildDesc(), RelationBuildRuleLock(), RelationBuildTriggers(), RememberToFreeTupleDescAtEOX(), ReorderBufferAccumulateInvalidations(), ReorderBufferSerializeReserve(), repalloc0(), RequestNamedLWLockTranche(), resize_intArrayType(), resizeString(), rmtree(), SetConstraintStateAddItem(), setup_regexp_matches(), setup_test_matches(), SnapBuildAddCommittedTxn(), socket_putmessage_noblock(), SPI_connect_ext(), SPI_repalloc(), statext_dependencies_build(), statext_dependencies_deserialize(), statext_mcv_deserialize(), str_casefold(), str_initcap(), str_tolower(), str_toupper(), str_udeescape(), subxact_info_add(), TidListEval(), tsqueryrecv(), tsvectorin(), tsvectorrecv(), tuplestore_alloc_read_pointer(), uniqueentry(), varstr_abbrev_convert(), varstrfastcmp_locale(), XLogEnsureRecordSpace(), and yyrealloc().

◆ repalloc0()

void * repalloc0 ( void pointer,
Size  oldsize,
Size  size 
)

Definition at line 1704 of file mcxt.c.

1705{
1706 void *ret;
1707
1708 /* catch wrong argument order */
1709 if (unlikely(oldsize > size))
1710 elog(ERROR, "invalid repalloc0 call: oldsize %zu, new size %zu",
1711 oldsize, size);
1712
1713 ret = repalloc(pointer, size);
1714 memset((char *) ret + oldsize, 0, (size - oldsize));
1715 return ret;
1716}

References elog, ERROR, fb(), repalloc(), and unlikely.

Referenced by grow_notnull_info().

◆ repalloc_extended()

void * repalloc_extended ( void pointer,
Size  size,
int  flags 
)

Definition at line 1667 of file mcxt.c.

1668{
1669#if defined(USE_ASSERT_CHECKING) || defined(USE_VALGRIND)
1670 MemoryContext context = GetMemoryChunkContext(pointer);
1671#endif
1672 void *ret;
1673
1675
1676 /* isReset must be false already */
1677 Assert(!context->isReset);
1678
1679 /*
1680 * For efficiency reasons, we purposefully offload the handling of
1681 * allocation failures to the MemoryContextMethods implementation as this
1682 * allows these checks to be performed only when an actual malloc needs to
1683 * be done to request more memory from the OS. Additionally, not having
1684 * to execute any instructions after this call allows the compiler to use
1685 * the sibling call optimization. If you're considering adding code after
1686 * this call, consider making it the responsibility of the 'realloc'
1687 * function instead.
1688 */
1689 ret = MCXT_METHOD(pointer, realloc) (pointer, size, flags);
1690 if (unlikely(ret == NULL))
1691 return NULL;
1692
1693 VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size);
1694
1695 return ret;
1696}

References Assert, AssertNotInCriticalSection, fb(), GetMemoryChunkContext(), MemoryContextData::isReset, MCXT_METHOD, realloc, unlikely, and VALGRIND_MEMPOOL_CHANGE.

Referenced by guc_realloc(), and repalloc_huge().

◆ repalloc_huge()

void * repalloc_huge ( void pointer,
Size  size 
)

Definition at line 1757 of file mcxt.c.

1758{
1759 /* this one seems not worth its own implementation */
1760 return repalloc_extended(pointer, size, MCXT_ALLOC_HUGE);
1761}

References MCXT_ALLOC_HUGE, and repalloc_extended().

Referenced by ginCombineData(), grow_memtuples(), grow_memtuples(), and spi_printtup().

Variable Documentation

◆ CacheMemoryContext

MemoryContext CacheMemoryContext = NULL

Definition at line 169 of file mcxt.c.

Referenced by _SPI_save_plan(), AllocateRelationDesc(), assign_record_type_typmod(), AttrDefaultFetch(), BuildEventTriggerCache(), BuildHardcodedDescriptor(), CatalogCacheCreateEntry(), CatalogCacheInitializeCache(), CheckNNConstraintFetch(), CreateCacheMemoryContext(), ensure_record_cache_typmod_slot_exists(), FetchRelationStates(), generate_partition_qual(), get_attribute_options(), get_tablespace(), GetCachedExpression(), GetCachedPlan(), GetFdwRoutineForRelation(), init_ts_config_cache(), InitCatCache(), InitializeAttoptCache(), InitializeRelfilenumberMap(), InitializeTableSpaceCache(), load_domaintype_info(), load_enum_cache_data(), load_rangetype_info(), load_relcache_init_file(), logicalrep_partmap_init(), logicalrep_relmap_init(), lookup_ts_config_cache(), lookup_ts_dictionary_cache(), lookup_ts_parser_cache(), lookup_type_cache(), LookupOpclassInfo(), pgoutput_startup(), plpgsql_compile_callback(), register_on_commit_action(), RehashCatCache(), RehashCatCacheLists(), RelationBuildLocalRelation(), RelationBuildPartitionDesc(), RelationBuildPartitionKey(), RelationBuildPublicationDesc(), RelationBuildRowSecurity(), RelationBuildRuleLock(), RelationBuildTriggers(), RelationBuildTupleDesc(), RelationCacheInitialize(), RelationCacheInitializePhase2(), RelationCacheInitializePhase3(), RelationGetFKeyList(), RelationGetIdentityKeyBitmap(), RelationGetIndexAttrBitmap(), RelationGetIndexList(), RelationGetStatExtList(), RelationInitIndexAccessInfo(), RelationParseRelOptions(), RememberToFreeTupleDescAtEOX(), SaveCachedPlan(), SearchCatCacheList(), set_schema_sent_in_streamed_txn(), SPI_keepplan(), sql_compile_callback(), and UploadManifest().

◆ CurrentMemoryContext

MemoryContext CurrentMemoryContext = NULL

Definition at line 160 of file mcxt.c.

Referenced by _brin_parallel_merge(), _bt_load(), _bt_preprocess_array_keys(), _gin_parallel_build_main(), _hash_finish_split(), _SPI_commit(), _SPI_rollback(), _SPI_save_plan(), advance_windowaggregate(), advance_windowaggregate_base(), afterTriggerInvokeEvents(), AllocateSnapshotBuilder(), array_agg_array_deserialize(), array_agg_array_finalfn(), array_agg_deserialize(), array_agg_finalfn(), array_positions(), array_sort_internal(), array_to_datum_internal(), AtStart_Memory(), AtSubStart_Memory(), AttachPartitionEnsureIndexes(), autovacuum_do_vac_analyze(), be_lo_export(), be_lo_from_bytea(), be_lo_put(), begin_heap_rewrite(), BeginCopyFrom(), BeginCopyTo(), blbuild(), blinsert(), brin_build_desc(), brin_minmax_multi_summary_out(), brin_minmax_multi_union(), brin_new_memtuple(), bringetbitmap(), brininsert(), bt_check_every_level(), btree_xlog_startup(), btvacuumscan(), build_colinfo_names_hash(), build_join_rel_hash(), BuildCachedPlan(), BuildParamLogString(), BuildRelationExtStatistics(), CheckForSessionAndXactLocks(), CloneRowTriggersToPartition(), CompactCheckpointerRequestQueue(), compactify_ranges(), CompleteCachedPlan(), compute_array_stats(), compute_expr_stats(), compute_scalar_stats(), compute_tsvector_stats(), ComputeExtStatisticsRows(), CopyCachedPlan(), CopyErrorData(), CopyFrom(), CopyFromTextLikeOneRow(), create_toast_table(), CreateCachedPlan(), CreateEmptyBlockRefTable(), CreateExecutorState(), CreateOneShotCachedPlan(), CreatePartitionPruneState(), CreateStandaloneExprContext(), createTempGistContext(), createTrgmNFA(), CreateTriggerFiringOn(), daitch_mokotoff(), daitch_mokotoff_coding(), DatumGetExpandedArray(), DatumGetExpandedArrayX(), DatumGetExpandedRecord(), datumTransfer(), dblink_get_connections(), DiscreteKnapsack(), do_analyze_rel(), do_start_worker(), DoCopyTo(), domain_check_internal(), dsnowball_init(), each_worker(), each_worker_jsonb(), elements_worker(), elements_worker_jsonb(), ensure_free_space_in_buffer(), eqjoinsel_find_matches(), errsave_start(), EventTriggerInvoke(), examine_expression(), exec_replication_command(), exec_stmt_block(), ExecAggCopyTransValue(), ExecEvalHashedScalarArrayOp(), ExecHashTableCreate(), ExecInitCoerceToDomain(), ExecInitFunctionScan(), ExecInitGatherMerge(), ExecInitIndexScan(), ExecInitMemoize(), ExecInitMergeAppend(), ExecInitModifyTable(), ExecInitProjectSet(), ExecInitRecursiveUnion(), ExecInitSetOp(), ExecInitSubPlan(), ExecInitTableFuncScan(), ExecInitWindowAgg(), ExecMakeTableFunctionResult(), ExecScanSubPlan(), ExecSetParamPlan(), ExecSetupPartitionTupleRouting(), execute_sql_string(), ExecuteTruncateGuts(), ExplainExecuteQuery(), fetch_array_arg_replace_nulls(), file_acquire_sample_rows(), fileIterateForeignScan(), fill_hba_view(), fill_ident_view(), find_all_inheritors(), find_or_create_child_node(), find_partition_scheme(), fmgr_info(), fmgr_info_other_lang(), geqo_eval(), get_actual_variable_range(), get_database_list(), get_json_object_as_hash(), get_relation_notnullatts(), get_subscription_list(), GetCachedExpression(), GetConnection(), GetErrorContextStack(), GetWALRecordsInfo(), GetXLogSummaryStats(), gin_check_parent_keys_consistency(), gin_check_posting_tree_parent_keys_consistency(), gin_extract_query_trgm(), gin_xlog_startup(), ginbeginscan(), GinBufferInit(), ginbuild(), ginbulkdelete(), gininsert(), ginInsertCleanup(), ginPlaceToPage(), gistbuild(), gistInitBuildBuffers(), gistInitParentMap(), gistvacuumscan(), IdentifySystem(), index_form_tuple(), initBloomState(), initGinState(), initGISTstate(), initialize_brin_buildstate(), initialize_peragg(), InitPartitionPruneContext(), initTrie(), inline_function(), inline_function_in_from(), intset_create(), json_unique_builder_init(), json_unique_check_init(), JsonTableInitOpaque(), libpqrcv_processTuples(), libpqsrv_PQwrap(), lo_get_fragment_internal(), lo_import_internal(), load_domaintype_info(), load_tzoffsets(), load_validator_library(), LogicalParallelApplyLoop(), makeIndexInfo(), makeNumericAggStateCurrentContext(), MakeTupleTableSlot(), materializeQueryResult(), MemoryContextDeleteOnly(), MemoryContextInit(), MemoryContextSwitchTo(), MJExamineQuals(), multi_sort_add_dimension(), NextCopyFrom(), open_auth_file(), optionListToArray(), palloc(), palloc0(), palloc_aligned(), palloc_extended(), ParallelWorkerMain(), parse_ident(), perform_default_encoding_conversion(), perform_work_item(), pg_buffercache_os_pages_internal(), pg_buffercache_pages(), pg_do_encoding_conversion(), pg_get_backend_memory_contexts(), pg_get_logical_snapshot_info(), pg_get_logical_snapshot_meta(), pg_get_statisticsobjdef_expressions(), pg_get_wal_block_info(), pg_stats_ext_mcvlist_items(), plan_cluster_use_sort(), plan_create_index_workers(), plperl_array_to_datum(), plperl_inline_handler(), plperl_return_next(), plperl_return_next_internal(), plperl_spi_commit(), plperl_spi_exec(), plperl_spi_exec_prepared(), plperl_spi_fetchrow(), plperl_spi_prepare(), plperl_spi_query(), plperl_spi_query_prepared(), plperl_spi_rollback(), plperl_util_elog(), plpgsql_compile_callback(), plpgsql_compile_inline(), plpgsql_estate_setup(), plpgsql_inline_handler(), plpgsql_validator(), plpython3_inline_handler(), pltcl_commit(), pltcl_elog(), pltcl_returnnext(), pltcl_rollback(), pltcl_SPI_execute(), pltcl_SPI_execute_plan(), pltcl_SPI_prepare(), pltcl_subtransaction(), PLy_commit(), PLy_cursor_fetch(), PLy_cursor_iternext(), PLy_cursor_plan(), PLy_cursor_query(), PLy_output(), PLy_rollback(), PLy_spi_execute_fetch_result(), PLy_spi_execute_plan(), PLy_spi_execute_query(), PLy_spi_prepare(), PLy_subtransaction_enter(), PLySequence_ToArray(), PLySequence_ToArray_recurse(), populate_array(), populate_recordset_object_start(), PortalRun(), PortalRunMulti(), postgresAcquireSampleRowsFunc(), postquel_start(), pq_parse_errornotice(), preparePresortedCols(), printtup_startup(), ProcessConfigFile(), prune_append_rel_partitions(), pstrdup(), publicationListToArray(), pull_up_simple_subquery(), pushJsonbValueScalar(), pushState(), RE_compile_and_cache(), regexp_split_to_array(), RelationBuildDesc(), RelationBuildRowSecurity(), ReorderBufferAllocate(), ReorderBufferImmediateInvalidation(), ReorderBufferProcessTXN(), ResetUnloggedRelations(), ResetUnloggedRelationsInDbspaceDir(), RevalidateCachedQuery(), ScanKeyEntryInitializeWithInfo(), serialize_expr_stats(), serializeAnalyzeStartup(), SerializePendingSyncs(), set_relation_partition_info(), set_rtable_names(), shdepReassignOwned(), shm_mq_attach(), smgr_bulk_start_smgr(), spg_xlog_startup(), spgbeginscan(), spgbuild(), spginsert(), spi_dest_startup(), split_text_accum_result(), sql_compile_callback(), standard_ExplainOneQuery(), startScanKey(), StartupDecodingContext(), statext_dependencies_build(), statext_mcv_serialize(), strlist_to_textarray(), sts_attach(), sts_initialize(), subquery_planner(), tbm_create(), test_basic(), test_empty(), test_enc_conversion(), test_pattern(), test_random(), text_to_array(), TidStoreCreateLocal(), tokenize_auth_file(), transformGraph(), transformRelOptions(), tsquery_rewrite_query(), tuple_data_split_internal(), tuplesort_begin_cluster(), tuplesort_begin_common(), tuplesort_begin_datum(), tuplesort_begin_heap(), tuplesort_begin_index_btree(), tuplesort_begin_index_gin(), tuplesort_begin_index_gist(), tuplestore_begin_common(), union_tuples(), UploadManifest(), validateForeignKeyConstraint(), write_console(), and xpath().

◆ CurTransactionContext

◆ ErrorContext

◆ LogMemoryContextInProgress

bool LogMemoryContextInProgress = false
static

Definition at line 178 of file mcxt.c.

Referenced by ProcessLogMemoryContextInterrupt().

◆ mcxt_methods

const MemoryContextMethods mcxt_methods[]
static

Definition at line 63 of file mcxt.c.

63 {
64 /* aset.c */
66 [MCTX_ASET_ID].free_p = AllocSetFree,
67 [MCTX_ASET_ID].realloc = AllocSetRealloc,
69 [MCTX_ASET_ID].delete_context = AllocSetDelete,
70 [MCTX_ASET_ID].get_chunk_context = AllocSetGetChunkContext,
71 [MCTX_ASET_ID].get_chunk_space = AllocSetGetChunkSpace,
72 [MCTX_ASET_ID].is_empty = AllocSetIsEmpty,
74#ifdef MEMORY_CONTEXT_CHECKING
76#endif
77
78 /* generation.c */
83 [MCTX_GENERATION_ID].delete_context = GenerationDelete,
88#ifdef MEMORY_CONTEXT_CHECKING
90#endif
91
92 /* slab.c */
93 [MCTX_SLAB_ID].alloc = SlabAlloc,
94 [MCTX_SLAB_ID].free_p = SlabFree,
95 [MCTX_SLAB_ID].realloc = SlabRealloc,
96 [MCTX_SLAB_ID].reset = SlabReset,
97 [MCTX_SLAB_ID].delete_context = SlabDelete,
98 [MCTX_SLAB_ID].get_chunk_context = SlabGetChunkContext,
99 [MCTX_SLAB_ID].get_chunk_space = SlabGetChunkSpace,
100 [MCTX_SLAB_ID].is_empty = SlabIsEmpty,
101 [MCTX_SLAB_ID].stats = SlabStats,
102#ifdef MEMORY_CONTEXT_CHECKING
103 [MCTX_SLAB_ID].check = SlabCheck,
104#endif
105
106 /* alignedalloc.c */
107 [MCTX_ALIGNED_REDIRECT_ID].alloc = NULL, /* not required */
110 [MCTX_ALIGNED_REDIRECT_ID].reset = NULL, /* not required */
111 [MCTX_ALIGNED_REDIRECT_ID].delete_context = NULL, /* not required */
114 [MCTX_ALIGNED_REDIRECT_ID].is_empty = NULL, /* not required */
115 [MCTX_ALIGNED_REDIRECT_ID].stats = NULL, /* not required */
116#ifdef MEMORY_CONTEXT_CHECKING
117 [MCTX_ALIGNED_REDIRECT_ID].check = NULL, /* not required */
118#endif
119
120 /* bump.c */
121 [MCTX_BUMP_ID].alloc = BumpAlloc,
122 [MCTX_BUMP_ID].free_p = BumpFree,
123 [MCTX_BUMP_ID].realloc = BumpRealloc,
124 [MCTX_BUMP_ID].reset = BumpReset,
125 [MCTX_BUMP_ID].delete_context = BumpDelete,
126 [MCTX_BUMP_ID].get_chunk_context = BumpGetChunkContext,
127 [MCTX_BUMP_ID].get_chunk_space = BumpGetChunkSpace,
128 [MCTX_BUMP_ID].is_empty = BumpIsEmpty,
129 [MCTX_BUMP_ID].stats = BumpStats,
130#ifdef MEMORY_CONTEXT_CHECKING
131 [MCTX_BUMP_ID].check = BumpCheck,
132#endif
133
134
135 /*
136 * Reserved and unused IDs should have dummy entries here. This allows us
137 * to fail cleanly if a bogus pointer is passed to pfree or the like. It
138 * seems sufficient to provide routines for the methods that might get
139 * invoked from inspection of a chunk (see MCXT_METHOD calls below).
140 */
152};
MemoryContext AlignedAllocGetChunkContext(void *pointer)
void * AlignedAllocRealloc(void *pointer, Size size, int flags)
Size AlignedAllocGetChunkSpace(void *pointer)
void AlignedAllocFree(void *pointer)
void AllocSetReset(MemoryContext context)
Definition aset.c:548
void * AllocSetRealloc(void *pointer, Size size, int flags)
Definition aset.c:1220
Size AllocSetGetChunkSpace(void *pointer)
Definition aset.c:1521
MemoryContext AllocSetGetChunkContext(void *pointer)
Definition aset.c:1492
void AllocSetStats(MemoryContext context, MemoryStatsPrintFunc printfunc, void *passthru, MemoryContextCounters *totals, bool print_to_stderr)
Definition aset.c:1580
bool AllocSetIsEmpty(MemoryContext context)
Definition aset.c:1555
void * AllocSetAlloc(MemoryContext context, Size size, int flags)
Definition aset.c:1014
void AllocSetFree(void *pointer)
Definition aset.c:1109
void AllocSetDelete(MemoryContext context)
Definition aset.c:634
void BumpFree(void *pointer)
Definition bump.c:646
void BumpDelete(MemoryContext context)
Definition bump.c:294
Size BumpGetChunkSpace(void *pointer)
Definition bump.c:678
void BumpStats(MemoryContext context, MemoryStatsPrintFunc printfunc, void *passthru, MemoryContextCounters *totals, bool print_to_stderr)
Definition bump.c:717
MemoryContext BumpGetChunkContext(void *pointer)
Definition bump.c:667
void BumpReset(MemoryContext context)
Definition bump.c:251
bool BumpIsEmpty(MemoryContext context)
Definition bump.c:689
void * BumpRealloc(void *pointer, Size size, int flags)
Definition bump.c:656
void * BumpAlloc(MemoryContext context, Size size, int flags)
Definition bump.c:517
void * GenerationRealloc(void *pointer, Size size, int flags)
Definition generation.c:829
void GenerationReset(MemoryContext context)
Definition generation.c:291
void GenerationFree(void *pointer)
Definition generation.c:718
MemoryContext GenerationGetChunkContext(void *pointer)
Definition generation.c:976
Size GenerationGetChunkSpace(void *pointer)
bool GenerationIsEmpty(MemoryContext context)
void GenerationStats(MemoryContext context, MemoryStatsPrintFunc printfunc, void *passthru, MemoryContextCounters *totals, bool print_to_stderr)
void GenerationDelete(MemoryContext context)
Definition generation.c:344
void * GenerationAlloc(MemoryContext context, Size size, int flags)
Definition generation.c:553
#define BOGUS_MCTX(id)
Definition mcxt.c:57
@ MCTX_15_RESERVED_WIPEDMEM_ID
@ MCTX_GENERATION_ID
@ MCTX_14_UNUSED_ID
@ MCTX_12_UNUSED_ID
@ MCTX_10_UNUSED_ID
@ MCTX_BUMP_ID
@ MCTX_11_UNUSED_ID
@ MCTX_8_UNUSED_ID
@ MCTX_1_RESERVED_GLIBC_ID
@ MCTX_SLAB_ID
@ MCTX_9_UNUSED_ID
@ MCTX_0_RESERVED_UNUSEDMEM_ID
@ MCTX_ASET_ID
@ MCTX_2_RESERVED_GLIBC_ID
@ MCTX_13_UNUSED_ID
void * SlabAlloc(MemoryContext context, Size size, int flags)
Definition slab.c:658
void SlabFree(void *pointer)
Definition slab.c:729
void SlabReset(MemoryContext context)
Definition slab.c:436
Size SlabGetChunkSpace(void *pointer)
Definition slab.c:919
bool SlabIsEmpty(MemoryContext context)
Definition slab.c:944
MemoryContext SlabGetChunkContext(void *pointer)
Definition slab.c:895
void * SlabRealloc(void *pointer, Size size, int flags)
Definition slab.c:858
void SlabStats(MemoryContext context, MemoryStatsPrintFunc printfunc, void *passthru, MemoryContextCounters *totals, bool print_to_stderr)
Definition slab.c:961
void SlabDelete(MemoryContext context)
Definition slab.c:506

Referenced by MemoryContextCreate().

◆ MessageContext

◆ PortalContext

◆ PostmasterContext

◆ TopMemoryContext

MemoryContext TopMemoryContext = NULL

Definition at line 166 of file mcxt.c.

Referenced by _PG_init(), AbortOutOfAnyTransaction(), add_reloption(), allocate_reloption(), AllocateAttribute(), AllocSetContextCreateInternal(), ApplyLauncherMain(), AtAbort_Memory(), AtStart_Memory(), AttachSession(), AutoVacLauncherMain(), BackendInitialize(), BackendMain(), BackgroundWorkerMain(), BackgroundWriterMain(), BaseBackupAddTarget(), be_tls_open_server(), build_guc_variables(), BumpContextCreate(), cache_single_string(), cached_function_compile(), cfunc_hashtable_insert(), check_foreign_key(), check_primary_key(), CheckpointerMain(), ClientAuthentication(), compile_plperl_function(), compile_pltcl_function(), CreateCacheMemoryContext(), CreateWaitEventSet(), dblink_init(), DCH_cache_getnew(), do_autovacuum(), dsm_create_descriptor(), dsm_impl_sysv(), EnablePortalManager(), EventTriggerBeginCompleteQuery(), exec_replication_command(), executeDateTimeMethod(), find_plan(), finish_xact_command(), GenerationContextCreate(), GetExplainExtensionId(), GetLocalBufferStorage(), GetLockConflicts(), getmissingattr(), GetNamedDSA(), GetNamedDSHash(), GetNamedDSMSegment(), GetPlannerExtensionId(), GetSessionDsmHandle(), hash_create(), init_database_collation(), init_missing_cache(), init_string_reloption(), InitDeadLockChecking(), initGlobalChannelTable(), initialize_reloptions(), initialize_target_list(), InitializeClientEncoding(), InitializeLogRepWorker(), InitializeParallelDSM(), InitializeSearchPath(), InitializeSession(), InitializeSystemUser(), InitPgFdwOptions(), InitSync(), InitWalSender(), InitXLogInsert(), injection_points_attach(), injection_points_detach(), llvm_compile_module(), llvm_create_context(), llvm_session_initialize(), LockAcquireExtended(), logicalrep_launcher_attach_dshmem(), LogicalRepApplyLoop(), mdinit(), MemoryContextAllocationFailure(), MemoryContextDeleteOnly(), MemoryContextInit(), mxid_to_string(), newLOfd(), NUM_cache_getnew(), on_dsm_detach(), PageSetChecksumCopy(), ParallelWorkerMain(), PerformAuthentication(), pg_backup_start(), pg_get_backend_memory_contexts(), pg_get_dsm_registry_allocations(), pg_newlocale_from_collation(), PgArchiverMain(), pgstat_attach_shmem(), pgstat_init_snapshot_fixed(), pgstat_prep_pending_entry(), pgstat_prep_snapshot(), pgstat_register_kind(), pgstat_setup_backend_status_context(), pgstat_setup_memcxt(), plperl_spi_prepare(), plpython3_inline_handler(), plsample_func_handler(), pltcl_SPI_prepare(), PLy_cursor_plan(), PLy_cursor_query(), PLy_procedure_create(), PLy_spi_execute_fetch_result(), PLy_spi_prepare(), populate_typ_list(), PostgresMain(), postmaster_child_launch(), PostmasterMain(), pq_init(), PreCommit_Notify(), PrepareClientEncoding(), ProcessLogMemoryContextInterrupt(), ProcessParallelApplyMessages(), ProcessParallelMessages(), ProcessStartupPacket(), px_find_cipher(), px_find_digest(), RE_compile_and_cache(), recomputeNamespacePath(), register_label_provider(), RegisterExtensionExplainOption(), RegisterResourceReleaseCallback(), RegisterSubXactCallback(), RegisterXactCallback(), RelationCreateStorage(), RelationDropStorage(), RequestNamedLWLockTranche(), ResourceOwnerCreate(), ResourceOwnerEnlarge(), RestoreClientConnectionInfo(), RestoreReindexState(), ri_HashCompareOp(), roles_is_member_of(), secure_open_gssapi(), sepgsql_avc_init(), sepgsql_xact_callback(), set_authn_id(), SetDatabasePath(), SharedRecordTypmodRegistryAttach(), SharedRecordTypmodRegistryInit(), SlabContextCreate(), spcache_init(), SPI_connect_ext(), test_create(), WalSummarizerMain(), WalWriterMain(), and XLOGShmemInit().

◆ TopTransactionContext