]> granicus.if.org Git - postgresql/blobdiff - src/include/storage/shmem.h
Update copyright for 2016
[postgresql] / src / include / storage / shmem.h
index b7a0d7b158c5243d638c36ba412032aa10a957eb..6468e6627ab601e19a23b056fb1f2fcc128deb40 100644 (file)
@@ -3,11 +3,18 @@
  * shmem.h
  *       shared memory management structures
  *
+ * Historical note:
+ * A long time ago, Postgres' 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-2004, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/storage/shmem.h,v 1.42 2004/08/29 04:13:10 momjian Exp $
+ * src/include/storage/shmem.h
  *
  *-------------------------------------------------------------------------
  */
 #include "utils/hsearch.h"
 
 
-/*
- * The shared memory region can start at a different address
- * in every process.  Shared memory "pointers" are actually
- * offsets relative to the start of the shared memory region(s).
- *
- * In current usage, this is not actually a problem, but we keep
- * the code that used to handle it...
- */
-typedef unsigned long SHMEM_OFFSET;
-
-#define INVALID_OFFSET (-1)
-#define BAD_LOCATION   (-1)
-
-/*
- * Start of the primary shared memory region, in this process' address space.
- * The macros in this header file can only cope with offsets into this
- * shared memory region!
- */
-extern DLLIMPORT SHMEM_OFFSET ShmemBase;
-
-
-/* coerce an offset into a pointer in this process's address space */
-#define MAKE_PTR(xx_offs)\
-  (ShmemBase+((unsigned long)(xx_offs)))
-
-/* coerce a pointer into a shmem offset */
-#define MAKE_OFFSET(xx_ptr)\
-  ((SHMEM_OFFSET) (((unsigned long)(xx_ptr))-ShmemBase))
-
-#define SHM_PTR_VALID(xx_ptr)\
-  (((unsigned long)(xx_ptr)) > ShmemBase)
-
-/* cannot have an offset to ShmemFreeStart (offset 0) */
-#define SHM_OFFSET_VALID(xx_offs)\
-  (((xx_offs) != 0) && ((xx_offs) != INVALID_OFFSET))
-
 /* shmqueue.c */
 typedef struct SHM_QUEUE
 {
-       SHMEM_OFFSET prev;
-       SHMEM_OFFSET next;
+       struct SHM_QUEUE *prev;
+       struct SHM_QUEUE *next;
 } SHM_QUEUE;
 
 /* shmem.c */
-extern void InitShmemAllocation(void *seghdr, bool init);
+extern void InitShmemAccess(void *seghdr);
+extern void InitShmemAllocation(void);
 extern void *ShmemAlloc(Size size);
-extern bool ShmemIsValid(unsigned long addr);
+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);
 
+/* ipci.c */
+extern void RequestAddinShmemSpace(Size size);
 
 /* size constants for the shmem index table */
  /* max size of data structure string name */
 #define SHMEM_INDEX_KEYSIZE             (48)
- /* maximum size of the shmem index table */
-#define SHMEM_INDEX_SIZE                (100)
+ /* estimated size of the shmem index table (not a hard limit) */
+#define SHMEM_INDEX_SIZE                (64)
 
 /* this is a hash bucket in the shmem index table */
 typedef struct
 {
        char            key[SHMEM_INDEX_KEYSIZE];               /* string name */
-       unsigned long location;         /* location in shared mem */
-       unsigned long size;                     /* numbytes allocated for the structure */
+       void       *location;           /* location in shared mem */
+       Size            size;                   /* # bytes allocated for the structure */
 } ShmemIndexEnt;
 
 /*
@@ -91,8 +67,12 @@ 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 Pointer SHMQueueNext(SHM_QUEUE *queue, SHM_QUEUE *curElem,
+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(SHM_QUEUE *queue);
+extern bool SHMQueueEmpty(const SHM_QUEUE *queue);
+extern bool SHMQueueIsDetached(const SHM_QUEUE *queue);
 
 #endif   /* SHMEM_H */