LCOV - code coverage report
Current view: top level - src/include/utils - memutils.h (source / functions) Hit Total Coverage
Test: PostgreSQL Lines: 6 6 100.0 %
Date: 2017-09-29 15:12:54 Functions: 1 1 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*-------------------------------------------------------------------------
       2             :  *
       3             :  * memutils.h
       4             :  *    This file contains declarations for memory allocation utility
       5             :  *    functions.  These are functions that are not quite widely used
       6             :  *    enough to justify going in utils/palloc.h, but are still part
       7             :  *    of the API of the memory management subsystem.
       8             :  *
       9             :  *
      10             :  * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
      11             :  * Portions Copyright (c) 1994, Regents of the University of California
      12             :  *
      13             :  * src/include/utils/memutils.h
      14             :  *
      15             :  *-------------------------------------------------------------------------
      16             :  */
      17             : #ifndef MEMUTILS_H
      18             : #define MEMUTILS_H
      19             : 
      20             : #include "nodes/memnodes.h"
      21             : 
      22             : 
      23             : /*
      24             :  * MaxAllocSize, MaxAllocHugeSize
      25             :  *      Quasi-arbitrary limits on size of allocations.
      26             :  *
      27             :  * Note:
      28             :  *      There is no guarantee that smaller allocations will succeed, but
      29             :  *      larger requests will be summarily denied.
      30             :  *
      31             :  * palloc() enforces MaxAllocSize, chosen to correspond to the limiting size
      32             :  * of varlena objects under TOAST.  See VARSIZE_4B() and related macros in
      33             :  * postgres.h.  Many datatypes assume that any allocatable size can be
      34             :  * represented in a varlena header.  This limit also permits a caller to use
      35             :  * an "int" variable for an index into or length of an allocation.  Callers
      36             :  * careful to avoid these hazards can access the higher limit with
      37             :  * MemoryContextAllocHuge().  Both limits permit code to assume that it may
      38             :  * compute twice an allocation's size without overflow.
      39             :  */
      40             : #define MaxAllocSize    ((Size) 0x3fffffff) /* 1 gigabyte - 1 */
      41             : 
      42             : #define AllocSizeIsValid(size)  ((Size) (size) <= MaxAllocSize)
      43             : 
      44             : #define MaxAllocHugeSize    (SIZE_MAX / 2)
      45             : 
      46             : #define AllocHugeSizeIsValid(size)  ((Size) (size) <= MaxAllocHugeSize)
      47             : 
      48             : 
      49             : /*
      50             :  * Standard top-level memory contexts.
      51             :  *
      52             :  * Only TopMemoryContext and ErrorContext are initialized by
      53             :  * MemoryContextInit() itself.
      54             :  */
      55             : extern PGDLLIMPORT MemoryContext TopMemoryContext;
      56             : extern PGDLLIMPORT MemoryContext ErrorContext;
      57             : extern PGDLLIMPORT MemoryContext PostmasterContext;
      58             : extern PGDLLIMPORT MemoryContext CacheMemoryContext;
      59             : extern PGDLLIMPORT MemoryContext MessageContext;
      60             : extern PGDLLIMPORT MemoryContext TopTransactionContext;
      61             : extern PGDLLIMPORT MemoryContext CurTransactionContext;
      62             : 
      63             : /* This is a transient link to the active portal's memory context: */
      64             : extern PGDLLIMPORT MemoryContext PortalContext;
      65             : 
      66             : /* Backwards compatibility macro */
      67             : #define MemoryContextResetAndDeleteChildren(ctx) MemoryContextReset(ctx)
      68             : 
      69             : 
      70             : /*
      71             :  * Memory-context-type-independent functions in mcxt.c
      72             :  */
      73             : extern void MemoryContextInit(void);
      74             : extern void MemoryContextReset(MemoryContext context);
      75             : extern void MemoryContextDelete(MemoryContext context);
      76             : extern void MemoryContextResetOnly(MemoryContext context);
      77             : extern void MemoryContextResetChildren(MemoryContext context);
      78             : extern void MemoryContextDeleteChildren(MemoryContext context);
      79             : extern void MemoryContextSetParent(MemoryContext context,
      80             :                        MemoryContext new_parent);
      81             : extern Size GetMemoryChunkSpace(void *pointer);
      82             : extern MemoryContext MemoryContextGetParent(MemoryContext context);
      83             : extern bool MemoryContextIsEmpty(MemoryContext context);
      84             : extern void MemoryContextStats(MemoryContext context);
      85             : extern void MemoryContextStatsDetail(MemoryContext context, int max_children);
      86             : extern void MemoryContextAllowInCriticalSection(MemoryContext context,
      87             :                                     bool allow);
      88             : 
      89             : #ifdef MEMORY_CONTEXT_CHECKING
      90             : extern void MemoryContextCheck(MemoryContext context);
      91             : #endif
      92             : extern bool MemoryContextContains(MemoryContext context, void *pointer);
      93             : 
      94             : /*
      95             :  * GetMemoryChunkContext
      96             :  *      Given a currently-allocated chunk, determine the context
      97             :  *      it belongs to.
      98             :  *
      99             :  * All chunks allocated by any memory context manager are required to be
     100             :  * preceded by the corresponding MemoryContext stored, without padding, in the
     101             :  * preceding sizeof(void*) bytes.  A currently-allocated chunk must contain a
     102             :  * backpointer to its owning context.  The backpointer is used by pfree() and
     103             :  * repalloc() to find the context to call.
     104             :  */
     105             : #ifndef FRONTEND
     106             : static inline MemoryContext
     107    12981052 : GetMemoryChunkContext(void *pointer)
     108             : {
     109             :     MemoryContext context;
     110             : 
     111             :     /*
     112             :      * Try to detect bogus pointers handed to us, poorly though we can.
     113             :      * Presumably, a pointer that isn't MAXALIGNED isn't pointing at an
     114             :      * allocated chunk.
     115             :      */
     116    12981052 :     Assert(pointer != NULL);
     117    12981052 :     Assert(pointer == (void *) MAXALIGN(pointer));
     118             : 
     119             :     /*
     120             :      * OK, it's probably safe to look at the context.
     121             :      */
     122    12981052 :     context = *(MemoryContext *) (((char *) pointer) - sizeof(void *));
     123             : 
     124    12981052 :     AssertArg(MemoryContextIsValid(context));
     125             : 
     126    12981052 :     return context;
     127             : }
     128             : #endif
     129             : 
     130             : /*
     131             :  * This routine handles the context-type-independent part of memory
     132             :  * context creation.  It's intended to be called from context-type-
     133             :  * specific creation routines, and noplace else.
     134             :  */
     135             : extern MemoryContext MemoryContextCreate(NodeTag tag, Size size,
     136             :                     MemoryContextMethods *methods,
     137             :                     MemoryContext parent,
     138             :                     const char *name);
     139             : 
     140             : 
     141             : /*
     142             :  * Memory-context-type-specific functions
     143             :  */
     144             : 
     145             : /* aset.c */
     146             : extern MemoryContext AllocSetContextCreate(MemoryContext parent,
     147             :                       const char *name,
     148             :                       Size minContextSize,
     149             :                       Size initBlockSize,
     150             :                       Size maxBlockSize);
     151             : 
     152             : /* slab.c */
     153             : extern MemoryContext SlabContextCreate(MemoryContext parent,
     154             :                   const char *name,
     155             :                   Size blockSize,
     156             :                   Size chunkSize);
     157             : 
     158             : /*
     159             :  * Recommended default alloc parameters, suitable for "ordinary" contexts
     160             :  * that might hold quite a lot of data.
     161             :  */
     162             : #define ALLOCSET_DEFAULT_MINSIZE   0
     163             : #define ALLOCSET_DEFAULT_INITSIZE  (8 * 1024)
     164             : #define ALLOCSET_DEFAULT_MAXSIZE   (8 * 1024 * 1024)
     165             : #define ALLOCSET_DEFAULT_SIZES \
     166             :     ALLOCSET_DEFAULT_MINSIZE, ALLOCSET_DEFAULT_INITSIZE, ALLOCSET_DEFAULT_MAXSIZE
     167             : 
     168             : /*
     169             :  * Recommended alloc parameters for "small" contexts that are never expected
     170             :  * to contain much data (for example, a context to contain a query plan).
     171             :  */
     172             : #define ALLOCSET_SMALL_MINSIZE   0
     173             : #define ALLOCSET_SMALL_INITSIZE  (1 * 1024)
     174             : #define ALLOCSET_SMALL_MAXSIZE   (8 * 1024)
     175             : #define ALLOCSET_SMALL_SIZES \
     176             :     ALLOCSET_SMALL_MINSIZE, ALLOCSET_SMALL_INITSIZE, ALLOCSET_SMALL_MAXSIZE
     177             : 
     178             : /*
     179             :  * Recommended alloc parameters for contexts that should start out small,
     180             :  * but might sometimes grow big.
     181             :  */
     182             : #define ALLOCSET_START_SMALL_SIZES \
     183             :     ALLOCSET_SMALL_MINSIZE, ALLOCSET_SMALL_INITSIZE, ALLOCSET_DEFAULT_MAXSIZE
     184             : 
     185             : 
     186             : /*
     187             :  * Threshold above which a request in an AllocSet context is certain to be
     188             :  * allocated separately (and thereby have constant allocation overhead).
     189             :  * Few callers should be interested in this, but tuplesort/tuplestore need
     190             :  * to know it.
     191             :  */
     192             : #define ALLOCSET_SEPARATE_THRESHOLD  8192
     193             : 
     194             : #define SLAB_DEFAULT_BLOCK_SIZE     (8 * 1024)
     195             : #define SLAB_LARGE_BLOCK_SIZE       (8 * 1024 * 1024)
     196             : 
     197             : #endif                          /* MEMUTILS_H */

Generated by: LCOV version 1.11