PostgreSQL Source Code git master
Loading...
Searching...
No Matches
dsm_impl.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define DSM_IMPL_POSIX   1
 
#define DSM_IMPL_SYSV   2
 
#define DSM_IMPL_WINDOWS   3
 
#define DSM_IMPL_MMAP   4
 
#define USE_DSM_SYSV
 
#define DEFAULT_DYNAMIC_SHARED_MEMORY_TYPE   DSM_IMPL_SYSV
 
#define USE_DSM_MMAP
 
#define PG_DYNSHMEM_DIR   "pg_dynshmem"
 
#define PG_DYNSHMEM_MMAP_FILE_PREFIX   "mmap."
 
#define DSM_HANDLE_INVALID   ((dsm_handle) 0)
 

Typedefs

typedef uint32 dsm_handle
 

Enumerations

enum  dsm_op { DSM_OP_CREATE , DSM_OP_ATTACH , DSM_OP_DETACH , DSM_OP_DESTROY }
 

Functions

bool dsm_impl_op (dsm_op op, dsm_handle handle, Size request_size, void **impl_private, void **mapped_address, Size *mapped_size, int elevel)
 
void dsm_impl_pin_segment (dsm_handle handle, void *impl_private, void **impl_private_pm_handle)
 
void dsm_impl_unpin_segment (dsm_handle handle, void **impl_private)
 

Variables

PGDLLIMPORT int dynamic_shared_memory_type
 
PGDLLIMPORT int min_dynamic_shared_memory
 

Macro Definition Documentation

◆ DEFAULT_DYNAMIC_SHARED_MEMORY_TYPE

#define DEFAULT_DYNAMIC_SHARED_MEMORY_TYPE   DSM_IMPL_SYSV

Definition at line 36 of file dsm_impl.h.

◆ DSM_HANDLE_INVALID

#define DSM_HANDLE_INVALID   ((dsm_handle) 0)

Definition at line 58 of file dsm_impl.h.

◆ DSM_IMPL_MMAP

#define DSM_IMPL_MMAP   4

Definition at line 20 of file dsm_impl.h.

◆ DSM_IMPL_POSIX

#define DSM_IMPL_POSIX   1

Definition at line 17 of file dsm_impl.h.

◆ DSM_IMPL_SYSV

#define DSM_IMPL_SYSV   2

Definition at line 18 of file dsm_impl.h.

◆ DSM_IMPL_WINDOWS

#define DSM_IMPL_WINDOWS   3

Definition at line 19 of file dsm_impl.h.

◆ PG_DYNSHMEM_DIR

#define PG_DYNSHMEM_DIR   "pg_dynshmem"

Definition at line 51 of file dsm_impl.h.

◆ PG_DYNSHMEM_MMAP_FILE_PREFIX

#define PG_DYNSHMEM_MMAP_FILE_PREFIX   "mmap."

Definition at line 52 of file dsm_impl.h.

◆ USE_DSM_MMAP

#define USE_DSM_MMAP

Definition at line 38 of file dsm_impl.h.

◆ USE_DSM_SYSV

#define USE_DSM_SYSV

Definition at line 34 of file dsm_impl.h.

Typedef Documentation

◆ dsm_handle

Definition at line 55 of file dsm_impl.h.

Enumeration Type Documentation

◆ dsm_op

Enumerator
DSM_OP_CREATE 
DSM_OP_ATTACH 
DSM_OP_DETACH 
DSM_OP_DESTROY 

Definition at line 61 of file dsm_impl.h.

62{
67} dsm_op;
dsm_op
Definition dsm_impl.h:62
@ DSM_OP_DETACH
Definition dsm_impl.h:65
@ DSM_OP_CREATE
Definition dsm_impl.h:63
@ DSM_OP_DESTROY
Definition dsm_impl.h:66
@ DSM_OP_ATTACH
Definition dsm_impl.h:64

Function Documentation

◆ dsm_impl_op()

bool dsm_impl_op ( dsm_op  op,
dsm_handle  handle,
Size  request_size,
void **  impl_private,
void **  mapped_address,
Size mapped_size,
int  elevel 
)
extern

Definition at line 160 of file dsm_impl.c.

163{
164 Assert(op == DSM_OP_CREATE || request_size == 0);
165 Assert((op != DSM_OP_CREATE && op != DSM_OP_ATTACH) ||
166 (*mapped_address == NULL && *mapped_size == 0));
167
169 {
170#ifdef USE_DSM_POSIX
171 case DSM_IMPL_POSIX:
172 return dsm_impl_posix(op, handle, request_size, impl_private,
173 mapped_address, mapped_size, elevel);
174#endif
175#ifdef USE_DSM_SYSV
176 case DSM_IMPL_SYSV:
177 return dsm_impl_sysv(op, handle, request_size, impl_private,
178 mapped_address, mapped_size, elevel);
179#endif
180#ifdef USE_DSM_WINDOWS
181 case DSM_IMPL_WINDOWS:
182 return dsm_impl_windows(op, handle, request_size, impl_private,
183 mapped_address, mapped_size, elevel);
184#endif
185#ifdef USE_DSM_MMAP
186 case DSM_IMPL_MMAP:
187 return dsm_impl_mmap(op, handle, request_size, impl_private,
188 mapped_address, mapped_size, elevel);
189#endif
190 default:
191 elog(ERROR, "unexpected dynamic shared memory type: %d",
193 return false;
194 }
195}
#define Assert(condition)
Definition c.h:945
int dynamic_shared_memory_type
Definition dsm_impl.c:113
static bool dsm_impl_sysv(dsm_op op, dsm_handle handle, Size request_size, void **impl_private, void **mapped_address, Size *mapped_size, int elevel)
Definition dsm_impl.c:424
static bool dsm_impl_posix(dsm_op op, dsm_handle handle, Size request_size, void **impl_private, void **mapped_address, Size *mapped_size, int elevel)
Definition dsm_impl.c:213
static bool dsm_impl_mmap(dsm_op op, dsm_handle handle, Size request_size, void **impl_private, void **mapped_address, Size *mapped_size, int elevel)
Definition dsm_impl.c:793
#define DSM_IMPL_WINDOWS
Definition dsm_impl.h:19
#define DSM_IMPL_POSIX
Definition dsm_impl.h:17
#define DSM_IMPL_SYSV
Definition dsm_impl.h:18
#define DSM_IMPL_MMAP
Definition dsm_impl.h:20
#define ERROR
Definition elog.h:39
#define elog(elevel,...)
Definition elog.h:226
static int fb(int x)

References Assert, dsm_impl_mmap(), DSM_IMPL_MMAP, dsm_impl_posix(), DSM_IMPL_POSIX, dsm_impl_sysv(), DSM_IMPL_SYSV, DSM_IMPL_WINDOWS, DSM_OP_ATTACH, DSM_OP_CREATE, dynamic_shared_memory_type, elog, ERROR, and fb().

Referenced by dsm_attach(), dsm_backend_startup(), dsm_cleanup_using_control_segment(), dsm_create(), dsm_detach(), dsm_detach_all(), dsm_postmaster_shutdown(), dsm_postmaster_startup(), and dsm_unpin_segment().

◆ dsm_impl_pin_segment()

void dsm_impl_pin_segment ( dsm_handle  handle,
void impl_private,
void **  impl_private_pm_handle 
)
extern

Definition at line 964 of file dsm_impl.c.

966{
968 {
969#ifdef USE_DSM_WINDOWS
970 case DSM_IMPL_WINDOWS:
972 {
973 HANDLE hmap;
974
975 if (!DuplicateHandle(GetCurrentProcess(), impl_private,
978 {
979 char name[64];
980
981 snprintf(name, 64, "%s.%u", SEGMENT_NAME_PREFIX, handle);
985 errmsg("could not duplicate handle for \"%s\": %m",
986 name)));
987 }
988
989 /*
990 * Here, we remember the handle that we created in the
991 * postmaster process. This handle isn't actually usable in
992 * any process other than the postmaster, but that doesn't
993 * matter. We're just holding onto it so that, if the segment
994 * is unpinned, dsm_impl_unpin_segment can close it.
995 */
996 *impl_private_pm_handle = hmap;
997 }
998 break;
999#endif
1000 default:
1001 break;
1002 }
1003}
static int errcode_for_dynamic_shared_memory(void)
Definition dsm_impl.c:1048
#define SEGMENT_NAME_PREFIX
Definition dsm_impl.c:121
#define ereport(elevel,...)
Definition elog.h:150
bool IsUnderPostmaster
Definition globals.c:120
static char * errmsg
#define snprintf
Definition port.h:260
const char * name
void _dosmaperr(unsigned long)
Definition win32error.c:177

References _dosmaperr(), DSM_IMPL_WINDOWS, dynamic_shared_memory_type, ereport, errcode_for_dynamic_shared_memory(), errmsg, ERROR, fb(), IsUnderPostmaster, name, SEGMENT_NAME_PREFIX, and snprintf.

Referenced by dsm_pin_segment().

◆ dsm_impl_unpin_segment()

void dsm_impl_unpin_segment ( dsm_handle  handle,
void **  impl_private 
)
extern

Definition at line 1015 of file dsm_impl.c.

1016{
1018 {
1019#ifdef USE_DSM_WINDOWS
1020 case DSM_IMPL_WINDOWS:
1022 {
1023 if (*impl_private &&
1024 !DuplicateHandle(PostmasterHandle, *impl_private,
1025 NULL, NULL, 0, FALSE,
1027 {
1028 char name[64];
1029
1030 snprintf(name, 64, "%s.%u", SEGMENT_NAME_PREFIX, handle);
1032 ereport(ERROR,
1034 errmsg("could not duplicate handle for \"%s\": %m",
1035 name)));
1036 }
1037
1038 *impl_private = NULL;
1039 }
1040 break;
1041#endif
1042 default:
1043 break;
1044 }
1045}

References _dosmaperr(), DSM_IMPL_WINDOWS, dynamic_shared_memory_type, ereport, errcode_for_dynamic_shared_memory(), errmsg, ERROR, fb(), IsUnderPostmaster, name, SEGMENT_NAME_PREFIX, and snprintf.

Referenced by dsm_unpin_segment().

Variable Documentation

◆ dynamic_shared_memory_type

PGDLLIMPORT int dynamic_shared_memory_type
extern

◆ min_dynamic_shared_memory

PGDLLIMPORT int min_dynamic_shared_memory
extern

Definition at line 116 of file dsm_impl.c.

Referenced by dsm_estimate_size().