1
/*-------------------------------------------------------------------------
4
* Microsoft Windows Win32 Shared Memory Emulation
6
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
9
* $PostgreSQL: pgsql/src/backend/port/win32/shmem.c,v 1.10 2004-12-31 22:00:37 pgsql Exp $
11
*-------------------------------------------------------------------------
19
static DWORD s_segsize = 0;
21
/* Detach from a shared mem area based on its address */
23
shmdt(const void *shmaddr)
25
if (UnmapViewOfFile((LPCVOID *) shmaddr))
31
/* Attach to an existing area */
33
shmat(int memId, void *shmaddr, int flag)
35
/* TODO -- shmat needs to count # attached to shared mem */
36
void *lpmem = MapViewOfFileEx((HANDLE) memId,
37
FILE_MAP_WRITE | FILE_MAP_READ,
38
0, 0, /* (DWORD)pshmdsc->segsize */ 0 /* s_segsize */ , shmaddr);
43
_dosmaperr(GetLastError());
49
/* Control a shared mem area */
51
shmctl(int shmid, int flag, struct shmid_ds * dummy)
56
CloseHandle((HANDLE) shmid);
61
/* Can only test for if exists */
62
int hmap = shmget(shmid, 0, 0);
66
/* Shared memory does not exist */
72
/* Shared memory does exist and must be in use */
73
shmctl(hmap, IPC_RMID, NULL); /* Release our hold on it */
83
/* Get an area based on the IPC key */
85
shmget(int memKey, int size, int flag)
92
sprintf(szShareMem, "PostgreSQL.%d", memKey);
96
hmap = CreateFileMapping((HANDLE) 0xFFFFFFFF, /* Use the swap file */
98
PAGE_READWRITE, /* Memory is Read/Write */
99
0L, /* Size Upper 32 Bits */
100
(DWORD) s_segsize, /* Size Lower 32 bits */
105
hmap = OpenFileMapping(FILE_MAP_ALL_ACCESS,
115
dwRet = GetLastError();
116
if (dwRet == ERROR_ALREADY_EXISTS && hmap && (flag & (IPC_CREAT | IPC_EXCL)))
118
/* Caller wanted to create the segment -- error if already exists */
125
/* Unable to get shared memory */
126
_dosmaperr(GetLastError());