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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * sinvaladt.h
  4.  *   POSTGRES shared cache invalidation segment definitions.
  5.  *
  6.  *
  7.  * Copyright (c) 1994, Regents of the University of California
  8.  *
  9.  * $Id: sinvaladt.h,v 1.14.2.1 1999/07/30 17:07:18 scrappy Exp $
  10.  *
  11.  *-------------------------------------------------------------------------
  12.  */
  13. #ifndef SINVALADT_H
  14. #define SINVALADT_H
  15. #include "storage/ipc.h"
  16. #include "storage/itemptr.h"
  17. /*
  18.  * The structure of the shared cache invaidation segment
  19.  *
  20.  */
  21. /*
  22. A------------- Header info --------------
  23. criticalSectionSemaphoreId
  24. generalSemaphoreId
  25. startEntrySection (offset a)
  26. endEntrySection (offset a + b)
  27. startFreeSpace (offset relative to B)
  28. startEntryChain (offset relatiev to B)
  29. endEntryChain (offset relative to B)
  30. numEntries
  31. maxNumEntries
  32. maxBackends
  33. procState[maxBackends] --> limit
  34. resetState (bool)
  35. a tag (POSTID)
  36. B------------- Start entry section -------
  37. SISegEntry --> entryData --> ... (see SharedInvalidData!)
  38. isfree (bool)
  39. next  (offset to next entry in chain )
  40. b   .... (dynamically growing down)
  41. C----------------End shared segment -------
  42. */
  43. /* Parameters (configurable)  *******************************************/
  44. #define MAXNUMMESSAGES 4000 /* maximum number of messages in seg */
  45. #define InvalidOffset 1000000000 /* a invalid offset  (End of
  46.  * chain) */
  47. typedef struct ProcState
  48. {
  49. int limit; /* the number of read messages */
  50. bool resetState; /* true, if backend has to reset its state */
  51. int tag; /* special tag, recieved from the
  52.  * postmaster */
  53. } ProcState;
  54. typedef struct SISeg
  55. {
  56. IpcSemaphoreId criticalSectionSemaphoreId; /* semaphore id */
  57. IpcSemaphoreId generalSemaphoreId; /* semaphore id */
  58. Offset startEntrySection; /* (offset a) */
  59. Offset endEntrySection;/* (offset a + b) */
  60. Offset startFreeSpace; /* (offset relative to B) */
  61. Offset startEntryChain;/* (offset relative to B) */
  62. Offset endEntryChain; /* (offset relative to B) */
  63. int numEntries;
  64. int maxNumEntries;
  65. int maxBackends; /* size of procState array */
  66. /*
  67.  * We declare procState as 1 entry because C wants a fixed-size array,
  68.  * but actually it is maxBackends entries long.
  69.  */
  70. ProcState procState[1]; /* reflects the invalidation state */
  71. /*
  72.  * The entry section begins after the end of the procState array.
  73.  * Everything there is controlled by offsets.
  74.  */
  75. } SISeg;
  76. typedef struct SharedInvalidData
  77. {
  78. int cacheId; /* XXX */
  79. Index hashIndex;
  80. ItemPointerData pointerData;
  81. } SharedInvalidData;
  82. typedef SharedInvalidData *SharedInvalid;
  83. typedef struct SISegEntry
  84. {
  85. SharedInvalidData entryData;/* the message data */
  86. bool isfree; /* entry free? */
  87. Offset next; /* offset to next entry */
  88. } SISegEntry;
  89. typedef struct SISegOffsets
  90. {
  91. Offset startSegment; /* always 0 (for now) */
  92. Offset offsetToFirstEntry; /* A + a = B */
  93. Offset offsetToEndOfSegment; /* A + a + b */
  94. } SISegOffsets;
  95. /****************************************************************************/
  96. /* synchronization of the shared buffer access */
  97. /*   access to the buffer is synchronized by the lock manager !! */
  98. /****************************************************************************/
  99. #define SI_LockStartValue  255
  100. #define SI_SharedLock   (-1)
  101. #define SI_ExclusiveLock  (-255)
  102. extern SISeg *shmInvalBuffer;
  103. /*
  104.  * prototypes for functions in sinvaladt.c
  105.  */
  106. extern int SIBackendInit(SISeg *segInOutP);
  107. extern int SISegmentInit(bool killExistingSegment, IPCKey key,
  108.   int maxBackends);
  109. extern bool SISetDataEntry(SISeg *segP, SharedInvalidData *data);
  110. extern void SISetProcStateInvalid(SISeg *segP);
  111. extern bool SIDelDataEntry(SISeg *segP);
  112. extern void SIReadEntryData(SISeg *segP, int backendId,
  113. void (*invalFunction) (), void (*resetFunction) ());
  114. extern void SIDelExpiredDataEntries(SISeg *segP);
  115. #endif  /* SINVALADT_H */