⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sinvaladt.h

📁 PostgreSQL 8.1.4的源码 适用于Linux下的开源数据库系统
💻 H
字号:
/*------------------------------------------------------------------------- * * sinvaladt.h *	  POSTGRES shared cache invalidation segment definitions. * * * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * $PostgreSQL: pgsql/src/include/storage/sinvaladt.h,v 1.40 2005/10/15 02:49:46 momjian Exp $ * *------------------------------------------------------------------------- */#ifndef SINVALADT_H#define SINVALADT_H#include "storage/sinval.h"/* * The shared cache invalidation manager is responsible for transmitting * invalidation messages between backends.	Any message sent by any backend * must be delivered to all already-running backends before it can be * forgotten. * * Conceptually, the messages are stored in an infinite array, where * maxMsgNum is the next array subscript to store a submitted message in, * minMsgNum is the smallest array subscript containing a message not yet * read by all backends, and we always have maxMsgNum >= minMsgNum.  (They * are equal when there are no messages pending.)  For each active backend, * there is a nextMsgNum pointer indicating the next message it needs to read; * we have maxMsgNum >= nextMsgNum >= minMsgNum for every backend. * * In reality, the messages are stored in a circular buffer of MAXNUMMESSAGES * entries.  We translate MsgNum values into circular-buffer indexes by * computing MsgNum % MAXNUMMESSAGES (this should be fast as long as * MAXNUMMESSAGES is a constant and a power of 2).	As long as maxMsgNum * doesn't exceed minMsgNum by more than MAXNUMMESSAGES, we have enough space * in the buffer.  If the buffer does overflow, we reset it to empty and * force each backend to "reset", ie, discard all its invalidatable state. * * We would have problems if the MsgNum values overflow an integer, so * whenever minMsgNum exceeds MSGNUMWRAPAROUND, we subtract MSGNUMWRAPAROUND * from all the MsgNum variables simultaneously.  MSGNUMWRAPAROUND can be * large so that we don't need to do this often.  It must be a multiple of * MAXNUMMESSAGES so that the existing circular-buffer entries don't need * to be moved when we do it. * * The struct type SharedInvalidationMessage, defining the contents of * a single message, is defined in sinval.h. *//* * Configurable parameters. * * MAXNUMMESSAGES: max number of shared-inval messages we can buffer. * Must be a power of 2 for speed. * * MSGNUMWRAPAROUND: how often to reduce MsgNum variables to avoid overflow. * Must be a multiple of MAXNUMMESSAGES.  Should be large. */#define MAXNUMMESSAGES 4096#define MSGNUMWRAPAROUND (MAXNUMMESSAGES * 4096)/* Per-backend state in shared invalidation structure */typedef struct ProcState{	/* nextMsgNum is -1 in an inactive ProcState array entry. */	int			nextMsgNum;		/* next message number to read, or -1 */	bool		resetState;		/* true, if backend has to reset its state */} ProcState;/* Shared cache invalidation memory segment */typedef struct SISeg{	/*	 * General state information	 */	int			minMsgNum;		/* oldest message still needed */	int			maxMsgNum;		/* next message number to be assigned */	int			lastBackend;	/* index of last active procState entry, +1 */	int			maxBackends;	/* size of procState array */	int			freeBackends;	/* number of empty procState slots */	/*	 * Circular buffer holding shared-inval messages	 */	SharedInvalidationMessage buffer[MAXNUMMESSAGES];	/*	 * Per-backend state info.	 *	 * We declare procState as 1 entry because C wants a fixed-size array, but	 * actually it is maxBackends entries long.	 */	ProcState	procState[1];	/* reflects the invalidation state */} SISeg;extern SISeg *shmInvalBuffer;	/* pointer to the shared inval buffer *//* * prototypes for functions in sinvaladt.c */extern void SIBufferInit(void);extern int	SIBackendInit(SISeg *segP);extern bool SIInsertDataEntry(SISeg *segP, SharedInvalidationMessage *data);extern int SIGetDataEntry(SISeg *segP, int backendId,			   SharedInvalidationMessage *data);extern void SIDelExpiredDataEntries(SISeg *segP);#endif   /* SINVALADT_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -