1/*-------------------------------------------------------------------------
2 *
3 * shmem.h
4 * shared memory management structures
5 *
6 * Historical note:
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.
13 *
14 * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
15 * Portions Copyright (c) 1994, Regents of the University of California
16 *
17 * src/include/storage/shmem.h
18 *
19 *-------------------------------------------------------------------------
20 */
21#ifndef SHMEM_H
22#define SHMEM_H
23
24#include "utils/hsearch.h"
25
26
27/* shmqueue.c */
28typedef struct SHM_QUEUE
29{
30 struct SHM_QUEUE *prev;
31 struct SHM_QUEUE *next;
32} SHM_QUEUE;
33
34/* shmem.c */
35extern void InitShmemAccess(void *seghdr);
36extern void InitShmemAllocation(void);
37extern void *ShmemAlloc(Size size);
38extern void *ShmemAllocNoError(Size size);
39extern void *ShmemAllocUnlocked(Size size);
40extern bool ShmemAddrIsValid(const void *addr);
41extern void InitShmemIndex(void);
42extern HTAB *ShmemInitHash(const char *name, long init_size, long max_size,
43 HASHCTL *infoP, int hash_flags);
44extern void *ShmemInitStruct(const char *name, Size size, bool *foundPtr);
45extern Size add_size(Size s1, Size s2);
46extern Size mul_size(Size s1, Size s2);
47
48/* ipci.c */
49extern void RequestAddinShmemSpace(Size size);
50
51/* size constants for the shmem index table */
52 /* max size of data structure string name */
53#define SHMEM_INDEX_KEYSIZE (48)
54 /* estimated size of the shmem index table (not a hard limit) */
55#define SHMEM_INDEX_SIZE (64)
56
57/* this is a hash bucket in the shmem index table */
58typedef struct
59{
60 char key[SHMEM_INDEX_KEYSIZE]; /* string name */
61 void *location; /* location in shared mem */
62 Size size; /* # bytes allocated for the structure */
63} ShmemIndexEnt;
64
65/*
66 * prototypes for functions in shmqueue.c
67 */
68extern void SHMQueueInit(SHM_QUEUE *queue);
69extern void SHMQueueElemInit(SHM_QUEUE *queue);
70extern void SHMQueueDelete(SHM_QUEUE *queue);
71extern void SHMQueueInsertBefore(SHM_QUEUE *queue, SHM_QUEUE *elem);
72extern void SHMQueueInsertAfter(SHM_QUEUE *queue, SHM_QUEUE *elem);
73extern Pointer SHMQueueNext(const SHM_QUEUE *queue, const SHM_QUEUE *curElem,
74 Size linkOffset);
75extern Pointer SHMQueuePrev(const SHM_QUEUE *queue, const SHM_QUEUE *curElem,
76 Size linkOffset);
77extern bool SHMQueueEmpty(const SHM_QUEUE *queue);
78extern bool SHMQueueIsDetached(const SHM_QUEUE *queue);
79
80#endif /* SHMEM_H */
81