*
* shmem.h
* shared memory management structures
*
* Historical note:
* A long time ago, openGauss' shared memory region was allowed to be mapped
* at a different address in each process, and shared memory "pointers" were
* passed around as offsets relative to the start of the shared memory region.
* That is no longer the case: each process must map the shared memory region
* at the same address. This means shared memory pointers can be passed
* around directly between different processes.
*
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/storage/shmem.h
*
* -------------------------------------------------------------------------
*/
#ifndef SHMEM_H
#define SHMEM_H
#include "utils/hsearch.h"
typedef struct SHM_QUEUE {
struct SHM_QUEUE* prev;
struct SHM_QUEUE* next;
} SHM_QUEUE;
extern void InitShmemAccess(void* seghdr);
extern void InitShmemAllocation(void);
extern void* ShmemAlloc(Size size);
extern bool ShmemAddrIsValid(const void* addr);
extern void InitShmemIndex(void);
extern HTAB* ShmemInitHash(const char* name, long init_size, long max_size, HASHCTL* infoP, int hash_flags);
extern void* ShmemInitStruct(const char* name, Size size, bool* foundPtr);
extern Size add_size(Size s1, Size s2);
extern Size mul_size(Size s1, Size s2);
extern void RequestAddinShmemSpace(Size size);
#define SHMEM_INDEX_KEYSIZE (48)
#define SHMEM_INDEX_SIZE (64)
typedef struct {
char key[SHMEM_INDEX_KEYSIZE];
void* location;
Size size;
} ShmemIndexEnt;
* prototypes for functions in shmqueue.c
*/
extern void SHMQueueInit(SHM_QUEUE* queue);
extern void SHMQueueElemInit(SHM_QUEUE* queue);
extern void SHMQueueDelete(SHM_QUEUE* queue);
extern void SHMQueueInsertBefore(SHM_QUEUE* queue, SHM_QUEUE* elem);
extern void SHMQueueInsertAfter(SHM_QUEUE* queue, SHM_QUEUE* elem);
extern Pointer SHMQueueNext(const SHM_QUEUE* queue, const SHM_QUEUE* curElem, Size linkOffset);
extern Pointer SHMQueuePrev(const SHM_QUEUE* queue, const SHM_QUEUE* curElem, Size linkOffset);
extern bool SHMQueueEmpty(const SHM_QUEUE* queue);
extern bool SHMQueueIsDetached(const SHM_QUEUE* queue);
extern void* HeapMemAlloc(Size size);
extern HTAB* HeapMemInitHash(const char* name, long init_size, long max_size, HASHCTL* infoP, int hash_flags);
extern void HeapMemResetHash(HTAB* hashtbl, const char* tabname);
#endif