1 /*-------------------------------------------------------------------------
4 * shared memory management structures
7 * A long time ago, Postgres' shared memory region was allowed to be mapped
8 * at a different address in each process, and shared memory "pointers" were
9 * passed around as offsets relative to the start of the shared memory region.
10 * That is no longer the case: each process must map the shared memory region
11 * at the same address. This means shared memory pointers can be passed
12 * around directly between different processes.
14 * Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
15 * Portions Copyright (c) 1994, Regents of the University of California
17 * src/include/storage/shmem.h
19 *-------------------------------------------------------------------------
24 #include "utils/hsearch.h"
28 typedef struct SHM_QUEUE
30 struct SHM_QUEUE *prev;
31 struct SHM_QUEUE *next;
35 extern void InitShmemAccess(void *seghdr);
36 extern void InitShmemAllocation(void);
37 extern void *ShmemAlloc(Size size);
38 extern bool ShmemAddrIsValid(const void *addr);
39 extern void InitShmemIndex(void);
40 extern HTAB *ShmemInitHash(const char *name, long init_size, long max_size,
41 HASHCTL *infoP, int hash_flags);
42 extern void *ShmemInitStruct(const char *name, Size size, bool *foundPtr);
43 extern Size add_size(Size s1, Size s2);
44 extern Size mul_size(Size s1, Size s2);
47 extern void RequestAddinShmemSpace(Size size);
49 /* size constants for the shmem index table */
50 /* max size of data structure string name */
51 #define SHMEM_INDEX_KEYSIZE (48)
52 /* estimated size of the shmem index table (not a hard limit) */
53 #define SHMEM_INDEX_SIZE (64)
55 /* this is a hash bucket in the shmem index table */
58 char key[SHMEM_INDEX_KEYSIZE]; /* string name */
59 void *location; /* location in shared mem */
60 Size size; /* # bytes allocated for the structure */
64 * prototypes for functions in shmqueue.c
66 extern void SHMQueueInit(SHM_QUEUE *queue);
67 extern void SHMQueueElemInit(SHM_QUEUE *queue);
68 extern void SHMQueueDelete(SHM_QUEUE *queue);
69 extern void SHMQueueInsertBefore(SHM_QUEUE *queue, SHM_QUEUE *elem);
70 extern void SHMQueueInsertAfter(SHM_QUEUE *queue, SHM_QUEUE *elem);
71 extern Pointer SHMQueueNext(const SHM_QUEUE *queue, const SHM_QUEUE *curElem,
73 extern Pointer SHMQueuePrev(const SHM_QUEUE *queue, const SHM_QUEUE *curElem,
75 extern bool SHMQueueEmpty(const SHM_QUEUE *queue);
76 extern bool SHMQueueIsDetached(const SHM_QUEUE *queue);