74 void **impl_private,
void **mapped_address,
75 Size *mapped_size,
int elevel);
80 void **impl_private,
void **mapped_address,
81 Size *mapped_size,
int elevel);
83 #ifdef USE_DSM_WINDOWS
85 void **impl_private,
void **mapped_address,
86 Size *mapped_size,
int elevel);
90 void **impl_private,
void **mapped_address,
91 Size *mapped_size,
int elevel);
102 #ifdef USE_DSM_WINDOWS
118 #define ZBUFFER_SIZE 8192
120 #define SEGMENT_NAME_PREFIX "Global/PostgreSQL"
160 void **impl_private,
void **mapped_address,
Size *mapped_size,
165 (*mapped_address == NULL && *mapped_size == 0));
172 mapped_address, mapped_size, elevel);
177 mapped_address, mapped_size, elevel);
179 #ifdef USE_DSM_WINDOWS
181 return dsm_impl_windows(op, handle, request_size, impl_private,
182 mapped_address, mapped_size, elevel);
187 mapped_address, mapped_size, elevel);
190 elog(
ERROR,
"unexpected dynamic shared memory type: %d",
213 void **impl_private,
void **mapped_address,
Size *mapped_size,
226 if (*mapped_address != NULL
227 && munmap(*mapped_address, *mapped_size) != 0)
231 errmsg(
"could not unmap shared memory segment \"%s\": %m",
235 *mapped_address = NULL;
241 errmsg(
"could not remove shared memory segment \"%s\": %m",
258 flags = O_RDWR | (op ==
DSM_OP_CREATE ? O_CREAT | O_EXCL : 0);
265 errmsg(
"could not open shared memory segment \"%s\": %m",
290 errmsg(
"could not stat shared memory segment \"%s\": %m",
309 errmsg(
"could not resize shared memory segment \"%s\" to %zu bytes: %m",
310 name, request_size)));
315 address = mmap(NULL, request_size, PROT_READ | PROT_WRITE,
331 errmsg(
"could not map shared memory segment \"%s\": %m",
335 *mapped_address = address;
336 *mapped_size = request_size;
355 sigset_t save_sigmask;
364 sigprocmask(SIG_SETMASK, &
BlockSig, &save_sigmask);
367 #if defined(HAVE_POSIX_FALLOCATE) && defined(__linux__)
382 rc = posix_fallocate(
fd, 0, size);
383 }
while (rc ==
EINTR);
396 }
while (rc < 0 && errno ==
EINTR);
403 sigprocmask(SIG_SETMASK, &save_sigmask, NULL);
423 void **impl_private,
void **mapped_address,
Size *mapped_size,
469 elog(
DEBUG4,
"System V shared memory key may not be IPC_PRIVATE");
479 if (*impl_private != NULL)
481 ident_cache = *impl_private;
482 ident = *ident_cache;
505 segsize = request_size;
508 if ((ident = shmget(
key, segsize, flags)) == -1)
512 int save_errno = errno;
518 errmsg(
"could not get shared memory segment: %m")));
523 *ident_cache = ident;
524 *impl_private = ident_cache;
531 *impl_private = NULL;
532 if (*mapped_address != NULL && shmdt(*mapped_address) != 0)
536 errmsg(
"could not unmap shared memory segment \"%s\": %m",
540 *mapped_address = NULL;
546 errmsg(
"could not remove shared memory segment \"%s\": %m",
558 if (shmctl(ident,
IPC_STAT, &shm) != 0)
562 errmsg(
"could not stat shared memory segment \"%s\": %m",
566 request_size = shm.shm_segsz;
571 if (address == (
void *) -1)
583 errmsg(
"could not map shared memory segment \"%s\": %m",
587 *mapped_address = address;
588 *mapped_size = request_size;
594 #ifdef USE_DSM_WINDOWS
610 void **impl_private,
void **mapped_address,
611 Size *mapped_size,
int elevel)
616 MEMORY_BASIC_INFORMATION info;
634 if (*mapped_address != NULL
635 && UnmapViewOfFile(*mapped_address) == 0)
640 errmsg(
"could not unmap shared memory segment \"%s\": %m",
644 if (*impl_private != NULL
645 && CloseHandle(*impl_private) == 0)
650 errmsg(
"could not remove shared memory segment \"%s\": %m",
655 *impl_private = NULL;
656 *mapped_address = NULL;
670 size_high = request_size >> 32;
674 size_low = (DWORD) request_size;
679 hmap = CreateFileMapping(INVALID_HANDLE_VALUE,
687 if (
errcode == ERROR_ALREADY_EXISTS ||
errcode == ERROR_ACCESS_DENIED)
706 errmsg(
"could not create shared memory segment \"%s\": %m",
713 hmap = OpenFileMapping(FILE_MAP_WRITE | FILE_MAP_READ,
721 errmsg(
"could not open shared memory segment \"%s\": %m",
728 address = MapViewOfFile(hmap, FILE_MAP_WRITE | FILE_MAP_READ,
742 errmsg(
"could not map shared memory segment \"%s\": %m",
753 if (VirtualQuery(address, &info,
sizeof(info)) == 0)
760 UnmapViewOfFile(address);
766 errmsg(
"could not stat shared memory segment \"%s\": %m",
771 *mapped_address = address;
772 *mapped_size = info.RegionSize;
773 *impl_private = hmap;
792 void **impl_private,
void **mapped_address,
Size *mapped_size,
806 if (*mapped_address != NULL
807 && munmap(*mapped_address, *mapped_size) != 0)
811 errmsg(
"could not unmap shared memory segment \"%s\": %m",
815 *mapped_address = NULL;
821 errmsg(
"could not remove shared memory segment \"%s\": %m",
829 flags = O_RDWR | (op ==
DSM_OP_CREATE ? O_CREAT | O_EXCL : 0);
835 errmsg(
"could not open shared memory segment \"%s\": %m",
859 errmsg(
"could not stat shared memory segment \"%s\": %m",
891 if (
write(
fd, zbuffer, goal) == goal)
906 errno = save_errno ? save_errno : ENOSPC;
910 errmsg(
"could not resize shared memory segment \"%s\" to %zu bytes: %m",
911 name, request_size)));
917 address = mmap(NULL, request_size, PROT_READ | PROT_WRITE,
932 errmsg(
"could not map shared memory segment \"%s\": %m",
936 *mapped_address = address;
937 *mapped_size = request_size;
943 errmsg(
"could not close shared memory segment \"%s\": %m",
963 void **impl_private_pm_handle)
967 #ifdef USE_DSM_WINDOWS
973 if (!DuplicateHandle(GetCurrentProcess(), impl_private,
974 PostmasterHandle, &hmap, 0, FALSE,
975 DUPLICATE_SAME_ACCESS))
983 errmsg(
"could not duplicate handle for \"%s\": %m",
994 *impl_private_pm_handle = hmap;
1017 #ifdef USE_DSM_WINDOWS
1021 if (*impl_private &&
1022 !DuplicateHandle(PostmasterHandle, *impl_private,
1023 NULL, NULL, 0, FALSE,
1024 DUPLICATE_CLOSE_SOURCE))
1032 errmsg(
"could not duplicate handle for \"%s\": %m",
1036 *impl_private = NULL;
1048 if (errno == EFBIG || errno == ENOMEM)
1049 return errcode(ERRCODE_OUT_OF_MEMORY);
elog(ERROR, "%s: %s", p2, msg)
void dsm_impl_pin_segment(dsm_handle handle, void *impl_private, void **impl_private_pm_handle)
int min_dynamic_shared_memory
static int errcode_for_dynamic_shared_memory(void)
#define SEGMENT_NAME_PREFIX
void dsm_impl_unpin_segment(dsm_handle handle, void **impl_private)
static int dsm_impl_posix_resize(int fd, off_t size)
bool dsm_impl_op(dsm_op op, dsm_handle handle, Size request_size, void **impl_private, void **mapped_address, Size *mapped_size, int elevel)
int dynamic_shared_memory_type
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)
const struct config_enum_entry dynamic_shared_memory_options[]
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)
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)
#define DEFAULT_DYNAMIC_SHARED_MEMORY_TYPE
#define PG_DYNSHMEM_MMAP_FILE_PREFIX
int errcode_for_file_access(void)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
int CloseTransientFile(int fd)
void ReleaseExternalFD(void)
void ReserveExternalFD(void)
int OpenTransientFile(const char *fileName, int fileFlags)
#define PG_FILE_MODE_OWNER
Assert(fmt[strlen(fmt) - 1] !='\n')
void pfree(void *pointer)
MemoryContext TopMemoryContext
void * palloc0(Size size)
void * MemoryContextAlloc(MemoryContext context, Size size)
static int fd(const char *x, int i)
@ WAIT_EVENT_DSM_ALLOCATE
@ WAIT_EVENT_DSM_FILL_ZERO_WRITE
static void pgstat_report_wait_start(uint32 wait_event_info)
static void pgstat_report_wait_end(void)
void _dosmaperr(unsigned long)