PostgreSQL Source Code  git master
buf_init.c File Reference
#include "postgres.h"
#include "storage/buf_internals.h"
#include "storage/bufmgr.h"
Include dependency graph for buf_init.c:

Go to the source code of this file.

Functions

void InitBufferPool (void)
 
Size BufferShmemSize (void)
 

Variables

BufferDescPaddedBufferDescriptors
 
char * BufferBlocks
 
ConditionVariableMinimallyPaddedBufferIOCVArray
 
WritebackContext BackendWritebackContext
 
CkptSortItemCkptBufferIds
 

Function Documentation

◆ BufferShmemSize()

Size BufferShmemSize ( void  )

Definition at line 156 of file buf_init.c.

References add_size(), mul_size(), NBuffers, PG_CACHE_LINE_SIZE, and StrategyShmemSize().

Referenced by CreateSharedMemoryAndSemaphores().

157 {
158  Size size = 0;
159 
160  /* size of buffer descriptors */
161  size = add_size(size, mul_size(NBuffers, sizeof(BufferDescPadded)));
162  /* to allow aligning buffer descriptors */
163  size = add_size(size, PG_CACHE_LINE_SIZE);
164 
165  /* size of data pages */
166  size = add_size(size, mul_size(NBuffers, BLCKSZ));
167 
168  /* size of stuff controlled by freelist.c */
169  size = add_size(size, StrategyShmemSize());
170 
171  /* size of I/O condition variables */
172  size = add_size(size, mul_size(NBuffers,
174  /* to allow aligning the above */
175  size = add_size(size, PG_CACHE_LINE_SIZE);
176 
177  /* size of checkpoint sort array in bufmgr.c */
178  size = add_size(size, mul_size(NBuffers, sizeof(CkptSortItem)));
179 
180  return size;
181 }
#define PG_CACHE_LINE_SIZE
Size mul_size(Size s1, Size s2)
Definition: shmem.c:519
Size add_size(Size s1, Size s2)
Definition: shmem.c:502
size_t Size
Definition: c.h:540
int NBuffers
Definition: globals.c:135
Size StrategyShmemSize(void)
Definition: freelist.c:454

◆ InitBufferPool()

void InitBufferPool ( void  )

Definition at line 67 of file buf_init.c.

References Assert, backend_flush_after, buf, BufferDesc::buf_id, BufferBlocks, BufferDescriptorGetContentLock, BufferDescriptorGetIOCV, CLEAR_BUFFERTAG, ConditionVariableInit(), BufferDesc::freeNext, FREENEXT_END_OF_LIST, GetBufferDescriptor, i, LWLockInitialize(), LWTRANCHE_BUFFER_CONTENT, NBuffers, pg_atomic_init_u32(), ShmemInitStruct(), BufferDesc::state, StrategyInitialize(), BufferDesc::tag, BufferDesc::wait_backend_pid, and WritebackContextInit().

Referenced by CreateSharedMemoryAndSemaphores().

68 {
69  bool foundBufs,
70  foundDescs,
71  foundIOCV,
72  foundBufCkpt;
73 
74  /* Align descriptors to a cacheline boundary. */
76  ShmemInitStruct("Buffer Descriptors",
77  NBuffers * sizeof(BufferDescPadded),
78  &foundDescs);
79 
80  BufferBlocks = (char *)
81  ShmemInitStruct("Buffer Blocks",
82  NBuffers * (Size) BLCKSZ, &foundBufs);
83 
84  /* Align condition variables to cacheline boundary. */
86  ShmemInitStruct("Buffer IO Condition Variables",
88  &foundIOCV);
89 
90  /*
91  * The array used to sort to-be-checkpointed buffer ids is located in
92  * shared memory, to avoid having to allocate significant amounts of
93  * memory at runtime. As that'd be in the middle of a checkpoint, or when
94  * the checkpointer is restarted, memory allocation failures would be
95  * painful.
96  */
98  ShmemInitStruct("Checkpoint BufferIds",
99  NBuffers * sizeof(CkptSortItem), &foundBufCkpt);
100 
101  if (foundDescs || foundBufs || foundIOCV || foundBufCkpt)
102  {
103  /* should find all of these, or none of them */
104  Assert(foundDescs && foundBufs && foundIOCV && foundBufCkpt);
105  /* note: this path is only taken in EXEC_BACKEND case */
106  }
107  else
108  {
109  int i;
110 
111  /*
112  * Initialize all the buffer headers.
113  */
114  for (i = 0; i < NBuffers; i++)
115  {
117 
118  CLEAR_BUFFERTAG(buf->tag);
119 
120  pg_atomic_init_u32(&buf->state, 0);
121  buf->wait_backend_pid = 0;
122 
123  buf->buf_id = i;
124 
125  /*
126  * Initially link all the buffers together as unused. Subsequent
127  * management of this list is done by freelist.c.
128  */
129  buf->freeNext = i + 1;
130 
133 
135  }
136 
137  /* Correct last entry of linked list */
138  GetBufferDescriptor(NBuffers - 1)->freeNext = FREENEXT_END_OF_LIST;
139  }
140 
141  /* Init other shared buffer-management stuff */
142  StrategyInitialize(!foundDescs);
143 
144  /* Initialize per-backend file flush context */
147 }
#define FREENEXT_END_OF_LIST
int wait_backend_pid
int backend_flush_after
Definition: bufmgr.c:158
void StrategyInitialize(bool init)
Definition: freelist.c:475
void WritebackContextInit(WritebackContext *context, int *max_pending)
Definition: bufmgr.c:4738
void ConditionVariableInit(ConditionVariable *cv)
void * ShmemInitStruct(const char *name, Size size, bool *foundPtr)
Definition: shmem.c:396
WritebackContext BackendWritebackContext
Definition: buf_init.c:23
static char * buf
Definition: pg_test_fsync.c:68
BufferDescPadded * BufferDescriptors
Definition: buf_init.c:20
#define GetBufferDescriptor(id)
#define BufferDescriptorGetIOCV(bdesc)
void LWLockInitialize(LWLock *lock, int tranche_id)
Definition: lwlock.c:740
ConditionVariableMinimallyPadded * BufferIOCVArray
Definition: buf_init.c:22
#define BufferDescriptorGetContentLock(bdesc)
#define Assert(condition)
Definition: c.h:804
#define CLEAR_BUFFERTAG(a)
Definition: buf_internals.h:98
CkptSortItem * CkptBufferIds
Definition: buf_init.c:24
size_t Size
Definition: c.h:540
BufferTag tag
int i
int NBuffers
Definition: globals.c:135
pg_atomic_uint32 state
static void pg_atomic_init_u32(volatile pg_atomic_uint32 *ptr, uint32 val)
Definition: atomics.h:223
char * BufferBlocks
Definition: buf_init.c:21

Variable Documentation

◆ BackendWritebackContext

WritebackContext BackendWritebackContext

Definition at line 23 of file buf_init.c.

Referenced by BufferAlloc().

◆ BufferBlocks

char* BufferBlocks

Definition at line 21 of file buf_init.c.

Referenced by InitBufferPool().

◆ BufferDescriptors

BufferDescPadded* BufferDescriptors

Definition at line 20 of file buf_init.c.

◆ BufferIOCVArray

Definition at line 22 of file buf_init.c.

◆ CkptBufferIds

CkptSortItem* CkptBufferIds

Definition at line 24 of file buf_init.c.

Referenced by BufferSync().