summaryrefslogtreecommitdiff
path: root/innobase/os/os0shm.c
diff options
context:
space:
mode:
Diffstat (limited to 'innobase/os/os0shm.c')
-rw-r--r--innobase/os/os0shm.c146
1 files changed, 146 insertions, 0 deletions
diff --git a/innobase/os/os0shm.c b/innobase/os/os0shm.c
new file mode 100644
index 00000000000..e03440cd4f4
--- /dev/null
+++ b/innobase/os/os0shm.c
@@ -0,0 +1,146 @@
+/******************************************************
+The interface to the operating system
+shared memory primitives
+
+(c) 1995 Innobase Oy
+
+Created 9/23/1995 Heikki Tuuri
+*******************************************************/
+
+#include "os0shm.h"
+#ifdef UNIV_NONINL
+#include "os0shm.ic"
+#endif
+
+#ifdef __WIN__
+#include "windows.h"
+
+typedef HANDLE os_shm_t;
+#endif
+
+/********************************************************************
+Creates an area of shared memory. It can be named so that
+different processes may access it in the same computer.
+If an area with the same name already exists, returns
+a handle to that area (where the size of the area is
+not changed even if this call requests a different size).
+To use the area, it first has to be mapped to the process
+address space by os_shm_map. */
+
+os_shm_t
+os_shm_create(
+/*==========*/
+ /* out, own: handle to the shared
+ memory area, NULL if error */
+ ulint size, /* in: area size < 4 GB */
+ char* name) /* in: name of the area as a null-terminated
+ string */
+{
+#ifdef __WIN__
+ os_shm_t shm;
+
+ ut_a(name);
+ ut_a(size > 0);
+ ut_a(size < 0xFFFFFFFF);
+
+ /* In Windows NT shared memory is created as a memory mapped
+ file */
+ shm = CreateFileMapping((HANDLE)0xFFFFFFFF, /* use operating system
+ swap file as the backing
+ file */
+ NULL, /* default security
+ descriptor */
+ PAGE_READWRITE, /* allow reading and
+ writing */
+ 0, /* size must be less
+ than 4 GB */
+ (DWORD)size,
+ name);
+ return(shm);
+#else
+ UT_NOT_USED(size);
+ UT_NOT_USED(name);
+
+ return(NULL);
+#endif
+}
+
+/***************************************************************************
+Frees a shared memory area. The area can be freed only after it
+has been unmapped in all the processes where it was mapped. */
+
+ibool
+os_shm_free(
+/*========*/
+ /* out: TRUE if success */
+ os_shm_t shm) /* in, own: handle to a shared memory area */
+{
+#ifdef __WIN__
+
+ BOOL ret;
+
+ ut_a(shm);
+
+ ret = CloseHandle(shm);
+
+ if (ret) {
+ return(TRUE);
+ } else {
+ return(FALSE);
+ }
+#else
+ UT_NOT_USED(shm);
+#endif
+}
+
+/***************************************************************************
+Maps a shared memory area in the address space of a process. */
+
+void*
+os_shm_map(
+/*=======*/
+ /* out: address of the area, NULL if error */
+ os_shm_t shm) /* in: handle to a shared memory area */
+{
+#ifdef __WIN__
+ void* mem;
+
+ ut_a(shm);
+
+ mem = MapViewOfFile(shm,
+ FILE_MAP_ALL_ACCESS, /* read and write access
+ allowed */
+ 0, /* map from start of */
+ 0, /* area */
+ 0); /* map the whole area */
+ return(mem);
+#else
+ UT_NOT_USED(shm);
+#endif
+}
+
+/***************************************************************************
+Unmaps a shared memory area from the address space of a process. */
+
+ibool
+os_shm_unmap(
+/*=========*/
+ /* out: TRUE if succeed */
+ void* addr) /* in: address of the area */
+{
+#ifdef __WIN__
+ BOOL ret;
+
+ ut_a(addr);
+
+ ret = UnmapViewOfFile(addr);
+
+ if (ret) {
+ return(TRUE);
+ } else {
+ return(FALSE);
+ }
+#else
+ UT_NOT_USED(addr);
+#endif
+}