📄 shmem.c
字号:
/*------------------------------------------------------------------------- * * shmem.c * Microsoft Windows Win32 Shared Memory Emulation * * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * * IDENTIFICATION * $PostgreSQL: pgsql/src/backend/port/win32/shmem.c,v 1.11 2005/10/15 02:49:23 momjian Exp $ * *------------------------------------------------------------------------- */#include "postgres.h"#include <stdio.h>#include <errno.h>static DWORD s_segsize = 0;/* Detach from a shared mem area based on its address */intshmdt(const void *shmaddr){ if (UnmapViewOfFile((LPCVOID *) shmaddr)) return 0; else return -1;}/* Attach to an existing area */void *shmat(int memId, void *shmaddr, int flag){ /* TODO -- shmat needs to count # attached to shared mem */ void *lpmem = MapViewOfFileEx((HANDLE) memId, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, /* (DWORD)pshmdsc->segsize */ 0 /* s_segsize */ , shmaddr); if (lpmem == NULL) { lpmem = (void *) -1; _dosmaperr(GetLastError()); } return lpmem;}/* Control a shared mem area */intshmctl(int shmid, int flag, struct shmid_ds * dummy){ if (flag == IPC_RMID) { /* Delete the area */ CloseHandle((HANDLE) shmid); return 0; } if (flag == IPC_STAT) { /* Can only test for if exists */ int hmap = shmget(shmid, 0, 0); if (hmap < 0) { /* Shared memory does not exist */ errno = EINVAL; return -1; } else { /* Shared memory does exist and must be in use */ shmctl(hmap, IPC_RMID, NULL); /* Release our hold on it */ errno = 0; return 0; } } errno = EINVAL; return -1;}/* Get an area based on the IPC key */intshmget(int memKey, int size, int flag){ HANDLE hmap; char szShareMem[32]; DWORD dwRet; s_segsize = size; sprintf(szShareMem, "PostgreSQL.%d", memKey); if (flag & IPC_CREAT) { hmap = CreateFileMapping((HANDLE) 0xFFFFFFFF, /* Use the swap file */ NULL, PAGE_READWRITE, /* Memory is Read/Write */ 0L, /* Size Upper 32 Bits */ (DWORD) s_segsize, /* Size Lower 32 bits */ szShareMem); } else { hmap = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, szShareMem); if (!hmap) { errno = ENOENT; return -1; } } dwRet = GetLastError(); if (dwRet == ERROR_ALREADY_EXISTS && hmap && (flag & (IPC_CREAT | IPC_EXCL))) { /* Caller wanted to create the segment -- error if already exists */ CloseHandle(hmap); errno = EEXIST; return -1; } else if (!hmap) { /* Unable to get shared memory */ _dosmaperr(GetLastError()); return -1; } return (int) hmap;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -