summaryrefslogtreecommitdiffstats
path: root/win/mmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'win/mmap.c')
-rw-r--r--win/mmap.c152
1 files changed, 152 insertions, 0 deletions
diff --git a/win/mmap.c b/win/mmap.c
new file mode 100644
index 000000000..de2098196
--- /dev/null
+++ b/win/mmap.c
@@ -0,0 +1,152 @@
+/*
+ This file is part of the KDE libraries
+ Copyright (C) 2004 Jaroslaw Staniek <js@iidea.pl>
+
+ These sources are based on ftp://g.oswego.edu/pub/misc/malloc.c
+ file by Doug Lea, released to the public domain.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <sys/mman.h>
+#include <assert.h>
+
+//#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+#define MORECORE_FAILURE ((void*)(-1))
+#define MUNMAP_FAILURE (-1)
+
+#define USE_MALLOC_LOCK 1
+
+/* Wait for spin lock */
+static int slwait (int *sl) {
+#ifdef KDEWIN32_9x
+ /* TODO */
+#else
+ while (InterlockedCompareExchange ((LONG volatile*) sl, (LONG) 1, (LONG) 0) != 0)
+ Sleep (0);
+#endif
+ return 0;
+}
+
+/* Release spin lock */
+static int slrelease (int *sl) {
+ InterlockedExchange (sl, 0);
+ return 0;
+}
+
+/* getpagesize for windows */
+static long getpagesize (void)
+{
+ static long g_pagesize = 0;
+ if (! g_pagesize) {
+ SYSTEM_INFO system_info;
+ GetSystemInfo (&system_info);
+ g_pagesize = system_info.dwPageSize;
+ }
+ return g_pagesize;
+}
+
+/* Spin lock for emulation code */
+static int g_sl;
+
+static long getregionsize (void)
+{
+ static long g_regionsize = 0;
+ if (! g_regionsize) {
+ SYSTEM_INFO system_info;
+ GetSystemInfo (&system_info);
+ g_regionsize = system_info.dwAllocationGranularity;
+ }
+ return g_regionsize;
+}
+
+//static void *mmap (void *ptr, long size, long prot, long type, long handle, long arg) {
+KDEWIN32_EXPORT void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset)
+{
+ static long g_pagesize;
+ static long g_regionsize;
+#ifdef TRACE
+ printf ("mmap %d\n", length);
+#endif
+#if defined (USE_MALLOC_LOCK)
+ /* Wait for spin lock */
+ slwait (&g_sl);
+#endif
+ /* First time initialization */
+ if (! g_pagesize)
+ g_pagesize = getpagesize ();
+ if (! g_regionsize)
+ g_regionsize = getregionsize ();
+ /* Assert preconditions */
+ assert ((unsigned) start % g_regionsize == 0);
+ assert (length % g_pagesize == 0);
+ /* Allocate this */
+ start = VirtualAlloc (start, length,
+ MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE);
+ if (! start) {
+ start = (void *) MORECORE_FAILURE;
+ goto mmap_exit;
+ }
+ /* Assert postconditions */
+ assert ((unsigned) start % g_regionsize == 0);
+#ifdef TRACE
+ printf ("Commit %p %d\n", start, length);
+#endif
+mmap_exit:
+#if defined (USE_MALLOC_LOCK)
+ /* Release spin lock */
+ slrelease (&g_sl);
+#endif
+ return start;
+}
+
+//static long munmap (void *ptr, long size) {
+KDEWIN32_EXPORT int munmap(void *start, size_t length)
+{
+ static long g_pagesize;
+ static long g_regionsize;
+ int rc = MUNMAP_FAILURE;
+#ifdef TRACE
+ printf ("munmap %p %d\n", start, length);
+#endif
+#if defined (USE_MALLOC_LOCK)
+ /* Wait for spin lock */
+ slwait (&g_sl);
+#endif
+ /* First time initialization */
+ if (! g_pagesize)
+ g_pagesize = getpagesize ();
+ if (! g_regionsize)
+ g_regionsize = getregionsize ();
+ /* Assert preconditions */
+ assert ((unsigned) start % g_regionsize == 0);
+ assert (length % g_pagesize == 0);
+ /* Free this */
+ if (! VirtualFree (start, 0,
+ MEM_RELEASE))
+ goto munmap_exit;
+ rc = 0;
+#ifdef TRACE
+ printf ("Release %p %d\n", start, length);
+#endif
+munmap_exit:
+#if defined (USE_MALLOC_LOCK)
+ /* Release spin lock */
+ slrelease (&g_sl);
+#endif
+ return rc;
+}