memutils.h
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:9k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * memutils.h
  4.  *   this file contains general memory alignment, allocation
  5.  *   and manipulation stuff that used to be spread out
  6.  *   between the following files:
  7.  *
  8.  * align.h alignment macros
  9.  * aset.h memory allocation set stuff
  10.  * oset.h   (used by aset.h)
  11.  * (bit.h bit array type / extern)
  12.  * clib.h mem routines
  13.  * limit.h max bits/byte, etc.
  14.  *
  15.  *
  16.  * Copyright (c) 1994, Regents of the University of California
  17.  *
  18.  * $Id: memutils.h,v 1.28.2.1 1999/08/02 05:25:26 scrappy Exp $
  19.  *
  20.  * NOTES
  21.  *   some of the information in this file will be moved to
  22.  *   other files, (like MaxHeapTupleSize and MaxAttributeSize).
  23.  *
  24.  *-------------------------------------------------------------------------
  25.  */
  26. #ifndef MEMUTILS_H
  27. #define MEMUTILS_H
  28. /*
  29.  * This is not needed by this include file, but by almost every file
  30.  * that includes this file.
  31.  */
  32. /* ----------------
  33.  * Alignment macros: align a length or address appropriately for a given type.
  34.  *
  35.  * There used to be some incredibly crufty platform-dependent hackery here,
  36.  * but now we rely on the configure script to get the info for us. Much nicer.
  37.  *
  38.  * NOTE: TYPEALIGN will not work if ALIGNVAL is not a power of 2.
  39.  * That case seems extremely unlikely to occur in practice, however.
  40.  * ----------------
  41.  */
  42. #define TYPEALIGN(ALIGNVAL,LEN) (((long)(LEN) + (ALIGNVAL-1)) & ~(ALIGNVAL-1))
  43. #define SHORTALIGN(LEN) TYPEALIGN(ALIGNOF_SHORT, (LEN))
  44. #define INTALIGN(LEN) TYPEALIGN(ALIGNOF_INT, (LEN))
  45. #define LONGALIGN(LEN) TYPEALIGN(ALIGNOF_LONG, (LEN))
  46. #define DOUBLEALIGN(LEN) TYPEALIGN(ALIGNOF_DOUBLE, (LEN))
  47. #define MAXALIGN(LEN) TYPEALIGN(MAXIMUM_ALIGNOF, (LEN))
  48. /*****************************************************************************
  49.  *   oset.h -- Fixed format ordered set definitions.  *
  50.  *****************************************************************************/
  51. /* Note:
  52.  * Fixed format ordered sets are <EXPLAIN>.
  53.  * XXX This is a preliminary version. Work is needed to explain
  54.  * XXX semantics of the external definitions. Otherwise, the
  55.  * XXX functional interface should not change.
  56.  *
  57.  */
  58. typedef struct OrderedElemData OrderedElemData;
  59. typedef OrderedElemData *OrderedElem;
  60. typedef struct OrderedSetData OrderedSetData;
  61. typedef OrderedSetData *OrderedSet;
  62. struct OrderedElemData
  63. {
  64. OrderedElem next; /* Next elem or &this->set->dummy */
  65. OrderedElem prev; /* Previous elem or &this->set->head */
  66. OrderedSet set; /* Parent set */
  67. };
  68. struct OrderedSetData
  69. {
  70. OrderedElem head; /* First elem or &this->dummy */
  71. OrderedElem dummy; /* (hack) Terminator == NULL */
  72. OrderedElem tail; /* Last elem or &this->head */
  73. Offset offset; /* Offset from struct base to elem */
  74. /* this could be signed short int! */
  75. };
  76. extern void OrderedSetInit(OrderedSet set, Offset offset);
  77. extern Pointer OrderedSetGetHead(OrderedSet set);
  78. extern Pointer OrderedElemGetPredecessor(OrderedElem elem);
  79. extern Pointer OrderedElemGetSuccessor(OrderedElem elem);
  80. extern void OrderedElemPop(OrderedElem elem);
  81. extern void OrderedElemPushInto(OrderedElem elem, OrderedSet Set);
  82. /*****************************************************************************
  83.  *   aset.h -- Allocation set definitions.  *
  84.  *****************************************************************************/
  85. /*
  86.  * Description:
  87.  * An allocation set is a set containing allocated elements.  When
  88.  * an allocation is requested for a set, memory is allocated and a
  89.  * pointer is returned.  Subsequently, this memory may be freed or
  90.  * reallocated.  In addition, an allocation set may be reset which
  91.  * will cause all memory allocated within it to be freed.
  92.  *
  93.  * Allocations may occur in four different modes. The mode of
  94.  * allocation does not affect the behavior of allocations except in
  95.  * terms of performance.  The allocation mode is set at the time of
  96.  * set initialization.  Once the mode is chosen, it cannot be changed
  97.  * unless the set is reinitialized.
  98.  *
  99.  * "Dynamic" mode forces all allocations to occur in a heap.  This
  100.  * is a good mode to use when small memory segments are allocated
  101.  * and freed very frequently. This is a good choice when allocation
  102.  * characteristics are unknown.  This is the default mode.
  103.  *
  104.  * "Static" mode attempts to allocate space as efficiently as possible
  105.  * without regard to freeing memory.  This mode should be chosen only
  106.  * when it is known that many allocations will occur but that very
  107.  * little of the allocated memory will be explicitly freed.
  108.  *
  109.  * "Tunable" mode is a hybrid of dynamic and static modes.  The
  110.  * tunable mode will use static mode allocation except when the
  111.  * allocation request exceeds a size limit supplied at the time of set
  112.  * initialization.  "Big" objects are allocated using dynamic mode.
  113.  *
  114.  * "Bounded" mode attempts to allocate space efficiently given a limit
  115.  * on space consumed by the allocation set.  This restriction can be
  116.  * considered a "soft" restriction, because memory segments will
  117.  * continue to be returned after the limit is exceeded.  The limit is
  118.  * specified at the time of set initialization like for tunable mode.
  119.  *
  120.  * Note:
  121.  * Allocation sets are not automatically reset on a system reset.
  122.  * Higher level code is responsible for cleaning up.
  123.  *
  124.  * There may be other modes in the future.
  125.  */
  126. /*
  127.  * AllocPointer
  128.  * Aligned pointer which may be a member of an allocation set.
  129.  */
  130. typedef Pointer AllocPointer;
  131. /*
  132.  * AllocMode
  133.  * Mode of allocation for an allocation set.
  134.  *
  135.  * Note:
  136.  * See above for a description of the various nodes.
  137.  */
  138. typedef enum AllocMode
  139. {
  140. DynamicAllocMode, /* always dynamically allocate */
  141. StaticAllocMode, /* always "statically" allocate */
  142. TunableAllocMode, /* allocations are "tuned" */
  143. BoundedAllocMode /* allocations bounded to fixed usage */
  144. } AllocMode;
  145. #define DefaultAllocMode DynamicAllocMode
  146. /*
  147.  * AllocBlock
  148.  * Small pieces of memory are taken from bigger blocks of
  149.  * memory with a size aligned to a power of two. These
  150.  * pieces are not free's separately, instead they are reused
  151.  * for the next allocation of a fitting size.
  152.  */
  153. typedef struct AllocBlockData
  154. {
  155. struct AllocSetData *aset;
  156. struct AllocBlockData *next;
  157. char    *freeptr;
  158. char    *endptr;
  159. } AllocBlockData;
  160. typedef AllocBlockData *AllocBlock;
  161. /*
  162.  * AllocChunk
  163.  * The prefix of each piece of memory in an AllocBlock
  164.  */
  165. typedef struct AllocChunkData
  166. {
  167. /* aset is the owning aset if allocated, or the freelist link if free */
  168. void    *aset;
  169. /* size is always the chunk size */
  170. Size size;
  171. } AllocChunkData;
  172. typedef AllocChunkData *AllocChunk;
  173. /*
  174.  * AllocSet
  175.  * Allocation set.
  176.  */
  177. typedef struct AllocSetData
  178. {
  179. struct AllocBlockData *blocks;
  180. #define ALLOCSET_NUM_FREELISTS 8
  181. struct AllocChunkData *freelist[ALLOCSET_NUM_FREELISTS];
  182. /* Note: this will change in the future to support other modes */
  183. } AllocSetData;
  184. typedef AllocSetData *AllocSet;
  185. /*
  186.  * AllocPointerIsValid
  187.  * True iff pointer is valid allocation pointer.
  188.  */
  189. #define AllocPointerIsValid(pointer) PointerIsValid(pointer)
  190. /*
  191.  * AllocSetIsValid
  192.  * True iff set is valid allocation set.
  193.  */
  194. #define AllocSetIsValid(set) PointerIsValid(set)
  195. extern void AllocSetInit(AllocSet set, AllocMode mode, Size limit);
  196. extern void AllocSetReset(AllocSet set);
  197. extern bool AllocSetContains(AllocSet set, AllocPointer pointer);
  198. extern AllocPointer AllocSetAlloc(AllocSet set, Size size);
  199. extern void AllocSetFree(AllocSet set, AllocPointer pointer);
  200. extern AllocPointer AllocSetRealloc(AllocSet set, AllocPointer pointer,
  201. Size size);
  202. extern void AllocSetDump(AllocSet set);
  203. /*****************************************************************************
  204.  *   clib.h -- Standard C library definitions  *
  205.  *****************************************************************************/
  206. /*
  207.  * Note:
  208.  * This file is OPERATING SYSTEM dependent!!!
  209.  *
  210.  */
  211. /*
  212.  * LibCCopyLength is only used within this file. -cim 6/12/90
  213.  *
  214.  */
  215. typedef int LibCCopyLength;
  216. /*
  217.  * MemoryCopy
  218.  * Copies fixed length block of memory to another.
  219.  */
  220. #define MemoryCopy(toBuffer, fromBuffer, length)
  221. memcpy(toBuffer, fromBuffer, length)
  222. /*****************************************************************************
  223.  *   limit.h -- POSTGRES limit definitions.  *
  224.  *****************************************************************************/
  225. #define MaxBitsPerByte 8
  226. typedef uint32 AttributeSize; /* XXX should be defined elsewhere */
  227. #define MaxHeapTupleSize 0x7fffffff
  228. #define MaxAttributeSize 0x7fffffff
  229. #define MaxIndexAttributeNumber 7
  230. #endif  /* MEMUTILS_H */