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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * buf_internals.h
  4.  *   Internal definitions.
  5.  *
  6.  *
  7.  * Copyright (c) 1994, Regents of the University of California
  8.  *
  9.  * $Id: buf_internals.h,v 1.29 1999/05/25 16:14:38 momjian Exp $
  10.  *
  11.  * NOTE
  12.  * If BUFFERPAGE0 is defined, then 0 will be used as a
  13.  * valid buffer page number.
  14.  *
  15.  *-------------------------------------------------------------------------
  16.  */
  17. #ifndef BUFMGR_INTERNALS_H
  18. #define BUFMGR_INTERNALS_H
  19. #include <storage/lmgr.h>
  20. #include <storage/buf.h>
  21. /* Buf Mgr constants */
  22. /* in bufmgr.c */
  23. extern int NBuffers;
  24. extern int Data_Descriptors;
  25. extern int Free_List_Descriptor;
  26. extern int Lookup_List_Descriptor;
  27. extern int Num_Descriptors;
  28. /*
  29.  * Flags for buffer descriptors
  30.  */
  31. #define BM_DIRTY (1 << 0)
  32. #define BM_PRIVATE (1 << 1)
  33. #define BM_VALID (1 << 2)
  34. #define BM_DELETED (1 << 3)
  35. #define BM_FREE (1 << 4)
  36. #define BM_IO_IN_PROGRESS (1 << 5)
  37. #define BM_IO_ERROR (1 << 6)
  38. #define BM_JUST_DIRTIED (1 << 7)
  39. typedef bits16 BufFlags;
  40. typedef struct sbufdesc BufferDesc;
  41. typedef struct sbufdesc BufferHdr;
  42. typedef struct buftag BufferTag;
  43. /* long * so alignment will be correct */
  44. typedef long **BufferBlock;
  45. struct buftag
  46. {
  47. LockRelId relId;
  48. BlockNumber blockNum; /* blknum relative to begin of reln */
  49. };
  50. #define CLEAR_BUFFERTAG(a) 
  51. (a)->relId.dbId = InvalidOid, 
  52. (a)->relId.relId = InvalidOid, 
  53. (a)->blockNum = InvalidBlockNumber 
  54. )
  55. #define INIT_BUFFERTAG(a,xx_reln,xx_blockNum) 
  56. (a)->blockNum = xx_blockNum, 
  57. (a)->relId = ((LockInfo)(xx_reln->lockInfo))->lockRelId 
  58. )
  59. #define BAD_BUFFER_ID(bid) ((bid<1) || (bid>(NBuffers)))
  60. #define INVALID_DESCRIPTOR (-3)
  61. /*
  62.  * struct sbufdesc -- shared buffer cache metadata for a single
  63.  *    shared buffer descriptor.
  64.  *
  65.  * We keep the name of the database and relation in which this
  66.  * buffer appears in order to avoid a catalog lookup on cache
  67.  * flush if we don't have the reldesc in the cache.  It is also
  68.  * possible that the relation to which this buffer belongs is
  69.  * not visible to all backends at the time that it gets flushed.
  70.  * Dbname, relname, dbid, and relid are enough to determine where
  71.  * to put the buffer, for all storage managers.
  72.  */
  73. struct sbufdesc
  74. {
  75. Buffer freeNext; /* link for freelist chain */
  76. Buffer freePrev;
  77. SHMEM_OFFSET data; /* pointer to data in buf pool */
  78. /* tag and id must be together for table lookup to work */
  79. BufferTag tag; /* file/block identifier */
  80. int buf_id; /* maps global desc to local desc */
  81. BufFlags flags; /* described below */
  82. unsigned refcount; /* # of times buffer is pinned */
  83. #ifdef HAS_TEST_AND_SET
  84. /* can afford a dedicated lock if test-and-set locks are available */
  85. slock_t io_in_progress_lock;
  86. slock_t cntx_lock; /* to lock access to page context */
  87. #endif  /* HAS_TEST_AND_SET */
  88. unsigned r_locks; /* # of shared locks */
  89. bool ri_lock; /* read-intent lock */
  90. bool w_lock; /* context exclusively locked */
  91. char sb_dbname[NAMEDATALEN]; /* name of db in which buf belongs */
  92. char sb_relname[NAMEDATALEN]; /* name of reln */
  93. };
  94. /*
  95.  * Buffer lock infos in BufferLocks below.
  96.  * We have to free these locks in elog(ERROR)...
  97.  */
  98. #define BL_IO_IN_PROGRESS (1 << 0) /* unimplemented */
  99. #define BL_R_LOCK (1 << 1)
  100. #define BL_RI_LOCK (1 << 2)
  101. #define BL_W_LOCK (1 << 3)
  102. /*
  103.  * mao tracing buffer allocation
  104.  */
  105. /*#define BMTRACE*/
  106. #ifdef BMTRACE
  107. typedef struct _bmtrace
  108. {
  109. int bmt_pid;
  110. long bmt_buf;
  111. long bmt_dbid;
  112. long bmt_relid;
  113. int bmt_blkno;
  114. int bmt_op;
  115. #define BMT_NOTUSED 0
  116. #define BMT_ALLOCFND 1
  117. #define BMT_ALLOCNOTFND 2
  118. #define BMT_DEALLOC 3
  119. } bmtrace;
  120. #endif  /* BMTRACE */
  121. /*
  122.  * Bufmgr Interface:
  123.  */
  124. /* Internal routines: only called by buf.c */
  125. /*freelist.c*/
  126. extern void AddBufferToFreelist(BufferDesc *bf);
  127. extern void PinBuffer(BufferDesc *buf);
  128. extern void PinBuffer_Debug(char *file, int line, BufferDesc *buf);
  129. extern void UnpinBuffer(BufferDesc *buf);
  130. extern BufferDesc *GetFreeBuffer(void);
  131. extern void InitFreeList(bool init);
  132. /* buf_table.c */
  133. extern void InitBufTable(void);
  134. extern BufferDesc *BufTableLookup(BufferTag *tagPtr);
  135. extern bool BufTableDelete(BufferDesc *buf);
  136. extern bool BufTableInsert(BufferDesc *buf);
  137. /* bufmgr.c */
  138. extern BufferDesc *BufferDescriptors;
  139. extern BufferBlock BufferBlocks;
  140. extern long *PrivateRefCount;
  141. extern long *LastRefCount;
  142. extern bits8 *BufferLocks;
  143. extern long *CommitInfoNeedsSave;
  144. extern SPINLOCK BufMgrLock;
  145. /* localbuf.c */
  146. extern long *LocalRefCount;
  147. extern BufferDesc *LocalBufferDescriptors;
  148. extern int NLocBuffer;
  149. extern BufferDesc *LocalBufferAlloc(Relation reln, BlockNumber blockNum,
  150.  bool *foundPtr);
  151. extern int WriteLocalBuffer(Buffer buffer, bool release);
  152. extern int FlushLocalBuffer(Buffer buffer, bool release);
  153. extern void InitLocalBuffer(void);
  154. extern void LocalBufferSync(void);
  155. extern void ResetLocalBufferPool(void);
  156. #endif  /* BUFMGR_INTERNALS_H */