summaryrefslogtreecommitdiff
path: root/src/backend/storage/buf_internals.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/storage/buf_internals.h')
-rw-r--r--src/backend/storage/buf_internals.h220
1 files changed, 220 insertions, 0 deletions
diff --git a/src/backend/storage/buf_internals.h b/src/backend/storage/buf_internals.h
new file mode 100644
index 00000000000..84583867faf
--- /dev/null
+++ b/src/backend/storage/buf_internals.h
@@ -0,0 +1,220 @@
+/*-------------------------------------------------------------------------
+ *
+ * buf_internals.h--
+ * Internal definitions.
+ *
+ *
+ * Copyright (c) 1994, Regents of the University of California
+ *
+ * $Id: buf_internals.h,v 1.1.1.1 1996/07/09 06:21:52 scrappy Exp $
+ *
+ * NOTE
+ * If BUFFERPAGE0 is defined, then 0 will be used as a
+ * valid buffer page number.
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef BUFMGR_INTERNALS_H
+#define BUFMGR_INTERNALS_H
+
+#include "postgres.h"
+#include "storage/buf.h"
+#include "storage/ipc.h"
+#include "storage/shmem.h"
+#include "miscadmin.h"
+#include "storage/lmgr.h"
+#include "utils/rel.h"
+#include "utils/relcache.h"
+
+/* Buf Mgr constants */
+/* in bufmgr.c */
+extern int NBuffers;
+extern int Data_Descriptors;
+extern int Free_List_Descriptor;
+extern int Lookup_List_Descriptor;
+extern int Num_Descriptors;
+
+/*
+ * Flags for buffer descriptors
+ */
+#define BM_DIRTY (1 << 0)
+#define BM_PRIVATE (1 << 1)
+#define BM_VALID (1 << 2)
+#define BM_DELETED (1 << 3)
+#define BM_FREE (1 << 4)
+#define BM_IO_IN_PROGRESS (1 << 5)
+#define BM_IO_ERROR (1 << 6)
+
+typedef bits16 BufFlags;
+
+typedef struct sbufdesc BufferDesc;
+typedef struct sbufdesc BufferHdr;
+typedef struct buftag BufferTag;
+/* long * so alignment will be correct */
+typedef long **BufferBlock;
+
+struct buftag{
+ LRelId relId;
+ BlockNumber blockNum; /* blknum relative to begin of reln */
+};
+
+#define CLEAR_BUFFERTAG(a)\
+ (a)->relId.dbId = InvalidOid; \
+ (a)->relId.relId = InvalidOid; \
+ (a)->blockNum = InvalidBlockNumber
+
+#define INIT_BUFFERTAG(a,xx_reln,xx_blockNum) \
+{ \
+ (a)->blockNum = xx_blockNum;\
+ (a)->relId = RelationGetLRelId(xx_reln); \
+}
+
+#define COPY_BUFFERTAG(a,b)\
+{ \
+ (a)->blockNum = (b)->blockNum;\
+ LRelIdAssign(*(a),*(b));\
+}
+
+#define EQUAL_BUFFERTAG(a,b) \
+ (((a)->blockNum == (b)->blockNum) &&\
+ (OID_Equal((a)->relId.relId,(b)->relId.relId)))
+
+
+#define BAD_BUFFER_ID(bid) ((bid<1) || (bid>(NBuffers)))
+#define INVALID_DESCRIPTOR (-3)
+
+/*
+ * bletch hack -- anyplace that we declare space for relation or
+ * database names, we just use '16', not a symbolic constant, to
+ * specify their lengths. BM_NAMESIZE is the length of these names,
+ * and is used in the buffer manager code. somebody with lots of
+ * spare time should do this for all the other modules, too.
+ */
+#define BM_NAMESIZE 16
+
+/*
+ * struct sbufdesc -- shared buffer cache metadata for a single
+ * shared buffer descriptor.
+ *
+ * We keep the name of the database and relation in which this
+ * buffer appears in order to avoid a catalog lookup on cache
+ * flush if we don't have the reldesc in the cache. It is also
+ * possible that the relation to which this buffer belongs is
+ * not visible to all backends at the time that it gets flushed.
+ * Dbname, relname, dbid, and relid are enough to determine where
+ * to put the buffer, for all storage managers.
+ */
+
+struct sbufdesc {
+ Buffer freeNext; /* link for freelist chain */
+ Buffer freePrev;
+ SHMEM_OFFSET data; /* pointer to data in buf pool */
+
+ /* tag and id must be together for table lookup to work */
+ BufferTag tag; /* file/block identifier */
+ int buf_id; /* maps global desc to local desc */
+
+ BufFlags flags; /* described below */
+ int16 bufsmgr; /* storage manager id for buffer */
+ unsigned refcount; /* # of times buffer is pinned */
+
+ char *sb_dbname; /* name of db in which buf belongs */
+ char *sb_relname; /* name of reln */
+#ifdef HAS_TEST_AND_SET
+ /* can afford a dedicated lock if test-and-set locks are available */
+ slock_t io_in_progress_lock;
+#endif /* HAS_TEST_AND_SET */
+
+ /*
+ * I padded this structure to a power of 2 (128 bytes on a MIPS) because
+ * BufferDescriptorGetBuffer is called a billion times and it does an
+ * C pointer subtraction (i.e., "x - y" -> array index of x relative
+ * to y, which is calculated using division by struct size). Integer
+ * ".div" hits you for 35 cycles, as opposed to a 1-cycle "sra" ...
+ * this hack cut 10% off of the time to create the Wisconsin database!
+ * It eats up more shared memory, of course, but we're (allegedly)
+ * going to make some of these types bigger soon anyway... -pma 1/2/93
+ */
+#if defined(PORTNAME_ultrix4)
+ char sb_pad[60]; /* no slock_t */
+#endif /* mips */
+#if defined(PORTNAME_sparc) || defined(PORTNAME_sparc_solaris) || defined(PORTNAME_irix5)
+ char sb_pad[56]; /* has slock_t */
+#endif /* sparc || irix5 */
+#if defined(PORTNAME_hpux)
+ char sb_pad[44]; /* has slock_t */
+#endif /* alpha */
+#if defined(PORTNAME_alpha)
+ char sb_pad[40]; /* has slock_t */
+#endif /* alpha */
+};
+
+/*
+ * mao tracing buffer allocation
+ */
+
+/*#define BMTRACE*/
+#ifdef BMTRACE
+
+typedef struct _bmtrace {
+ int bmt_pid;
+ long bmt_buf;
+ long bmt_dbid;
+ long bmt_relid;
+ int bmt_blkno;
+ int bmt_op;
+
+#define BMT_NOTUSED 0
+#define BMT_ALLOCFND 1
+#define BMT_ALLOCNOTFND 2
+#define BMT_DEALLOC 3
+
+} bmtrace;
+
+#endif /* BMTRACE */
+
+
+/*
+ * Bufmgr Interface:
+ */
+
+/* Internal routines: only called by buf.c */
+
+/*freelist.c*/
+extern void AddBufferToFreelist(BufferDesc *bf);
+extern void PinBuffer(BufferDesc *buf);
+extern void PinBuffer_Debug(char *file, int line, BufferDesc *buf);
+extern void UnpinBuffer(BufferDesc *buf);
+extern void UnpinBuffer_Debug(char *file, int line, BufferDesc *buf);
+extern BufferDesc *GetFreeBuffer(void);
+extern void InitFreeList(bool init);
+extern void DBG_FreeListCheck(int nfree);
+
+/* buf_table.c */
+extern void InitBufTable(void);
+extern BufferDesc *BufTableLookup(BufferTag *tagPtr);
+extern bool BufTableDelete(BufferDesc *buf);
+extern bool BufTableInsert(BufferDesc *buf);
+extern void DBG_LookupListCheck(int nlookup);
+
+/* bufmgr.c */
+extern BufferDesc *BufferDescriptors;
+extern BufferBlock BufferBlocks;
+extern long *PrivateRefCount;
+extern long *LastRefCount;
+extern SPINLOCK BufMgrLock;
+
+/* localbuf.c */
+extern long *LocalRefCount;
+extern BufferDesc *LocalBufferDescriptors;
+extern int NLocBuffer;
+
+extern BufferDesc *LocalBufferAlloc(Relation reln, BlockNumber blockNum,
+ bool *foundPtr);
+extern int WriteLocalBuffer(Buffer buffer, bool release);
+extern int FlushLocalBuffer(Buffer buffer);
+extern void InitLocalBuffer();
+extern void LocalBufferSync();
+extern void ResetLocalBufferPool();
+
+#endif /* BUFMGR_INTERNALS_H */