Restore deps/mman
authornegativeExponent <negativeExponent@users.noreply.github.com>
Wed, 21 Apr 2021 00:04:21 +0000 (08:04 +0800)
committernegativeExponent <negativeExponent@users.noreply.github.com>
Wed, 21 Apr 2021 00:04:21 +0000 (08:04 +0800)
Accidentally purged in last commit, needed for lightrec/lightning

16 files changed:
deps/mman/.gitignore [new file with mode: 0644]
deps/mman/.gitrepo [new file with mode: 0644]
deps/mman/.vs/mman/v14/.suo [new file with mode: 0644]
deps/mman/CMakeLists.txt [new file with mode: 0644]
deps/mman/Makefile [new file with mode: 0644]
deps/mman/README.md [new file with mode: 0644]
deps/mman/UpgradeLog.htm [new file with mode: 0644]
deps/mman/configure [new file with mode: 0755]
deps/mman/mman-win32.pro [new file with mode: 0644]
deps/mman/mman.c [new file with mode: 0644]
deps/mman/mman.h [new file with mode: 0644]
deps/mman/mman.sln [new file with mode: 0644]
deps/mman/mman.vcxproj [new file with mode: 0644]
deps/mman/mman.vcxproj.filters [new file with mode: 0644]
deps/mman/mman.vcxproj.user [new file with mode: 0644]
deps/mman/test.c [new file with mode: 0644]

diff --git a/deps/mman/.gitignore b/deps/mman/.gitignore
new file mode 100644 (file)
index 0000000..5f778db
--- /dev/null
@@ -0,0 +1,2 @@
+x64
+mman.VC.db
\ No newline at end of file
diff --git a/deps/mman/.gitrepo b/deps/mman/.gitrepo
new file mode 100644 (file)
index 0000000..7e6585b
--- /dev/null
@@ -0,0 +1,12 @@
+; DO NOT EDIT (unless you know what you are doing)
+;
+; This subdirectory is a git "subrepo", and this file is maintained by the
+; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme
+;
+[subrepo]
+       remote = https://github.com/witwall/mman-win32
+       branch = master
+       commit = 2d1c576e62b99e85d99407e1a88794c6e44c3310
+       parent = 19599a744a114b242c401d5ac1f0bcfc369453ee
+       method = merge
+       cmdver = 0.4.1
diff --git a/deps/mman/.vs/mman/v14/.suo b/deps/mman/.vs/mman/v14/.suo
new file mode 100644 (file)
index 0000000..57e963c
Binary files /dev/null and b/deps/mman/.vs/mman/v14/.suo differ
diff --git a/deps/mman/CMakeLists.txt b/deps/mman/CMakeLists.txt
new file mode 100644 (file)
index 0000000..72b9c26
--- /dev/null
@@ -0,0 +1,33 @@
+project (mman-win32 C)
+
+cmake_minimum_required (VERSION 2.8)
+
+option (BUILD_SHARED_LIBS "shared/static libs" ON) 
+option (BUILD_TESTS "tests?" OFF)
+
+set (headers mman.h)
+set (sources mman.c)
+
+add_library (mman ${sources})
+
+if (BUILD_SHARED_LIBS)
+       target_compile_definitions(mman
+               PUBLIC MMAN_LIBRARY_DLL
+               PRIVATE MMAN_LIBRARY
+       )
+endif()
+
+install (TARGETS mman RUNTIME DESTINATION bin
+                      LIBRARY DESTINATION lib${LIB_SUFFIX}
+                      ARCHIVE DESTINATION lib${LIB_SUFFIX})
+
+install (FILES ${headers} DESTINATION include/sys)
+
+if (BUILD_TESTS)
+  enable_testing ()
+  add_executable (t_mman test.c)
+  target_link_libraries (t_mman mman)
+  add_test (NAME t_mman COMMAND t_mman${CMAKE_EXECUTABLE_SUFFIX})
+endif ()
+
+
diff --git a/deps/mman/Makefile b/deps/mman/Makefile
new file mode 100644 (file)
index 0000000..f6af361
--- /dev/null
@@ -0,0 +1,68 @@
+#
+# mman-win32 (mingw32) Makefile
+#
+include config.mak
+
+CFLAGS=-Wall -O3 -fomit-frame-pointer
+
+ifeq ($(BUILD_STATIC),yes)
+       TARGETS+=libmman.a
+       INSTALL+=static-install
+endif
+
+ifeq ($(BUILD_SHARED),yes)
+       TARGETS+=libmman.dll
+       INSTALL+=shared-install
+       CFLAGS+=-DMMAN_LIBRARY_DLL -DMMAN_LIBRARY
+endif
+
+ifeq ($(BUILD_MSVC),yes)
+       SHFLAGS+=-Wl,--output-def,libmman.def
+       INSTALL+=lib-install
+endif
+
+all: $(TARGETS)
+
+mman.o: mman.c mman.h
+       $(CC) -o mman.o -c mman.c $(CFLAGS)
+
+libmman.a: mman.o
+       $(AR) cru libmman.a mman.o
+       $(RANLIB) libmman.a
+
+libmman.dll: mman.o
+       $(CC) -shared -o libmman.dll mman.o -Wl,--out-implib,libmman.dll.a
+
+header-install:
+       mkdir -p $(DESTDIR)$(incdir)
+       cp mman.h $(DESTDIR)$(incdir)
+
+static-install: header-install
+       mkdir -p $(DESTDIR)$(libdir)
+       cp libmman.a $(DESTDIR)$(libdir)
+
+shared-install: header-install
+       mkdir -p $(DESTDIR)$(libdir)
+       cp libmman.dll.a $(DESTDIR)$(libdir)
+       mkdir -p $(DESTDIR)$(bindir)
+       cp libmman.dll $(DESTDIR)$(bindir)
+
+lib-install:
+       mkdir -p $(DESTDIR)$(libdir)
+       cp libmman.lib $(DESTDIR)$(libdir)
+
+install: $(INSTALL)
+
+test.exe: test.c mman.c mman.h
+       $(CC) -o test.exe test.c -L. -lmman
+
+test: $(TARGETS) test.exe
+       test.exe
+
+clean::
+       rm -f mman.o libmman.a libmman.dll.a libmman.dll libmman.def libmman.lib test.exe *.dat
+
+distclean: clean
+       rm -f config.mak
+
+.PHONY: clean distclean install test
diff --git a/deps/mman/README.md b/deps/mman/README.md
new file mode 100644 (file)
index 0000000..9df50e3
--- /dev/null
@@ -0,0 +1,10 @@
+mman-win32
+==========
+
+mman library for Windows. mirror of https://code.google.com/p/mman-win32/
+
+A light implementation of the mmap functions for MinGW.
+
+The mmap-win32 library implements a wrapper for mmap functions around the memory mapping Windows API.
+
+License: MIT License
diff --git a/deps/mman/UpgradeLog.htm b/deps/mman/UpgradeLog.htm
new file mode 100644 (file)
index 0000000..c15fdf0
Binary files /dev/null and b/deps/mman/UpgradeLog.htm differ
diff --git a/deps/mman/configure b/deps/mman/configure
new file mode 100755 (executable)
index 0000000..665cb1e
--- /dev/null
@@ -0,0 +1,170 @@
+#!/bin/sh
+# mmap-win32 configure script
+#
+# Parts copied from FFmpeg's configure
+#
+
+set_all(){
+    value=$1
+    shift
+    for var in $*; do
+        eval $var=$value
+    done
+}
+
+enable(){
+    set_all yes $*
+}
+
+disable(){
+    set_all no $*
+}
+
+enabled(){
+    eval test "x\$$1" = "xyes"
+}
+
+disabled(){
+    eval test "x\$$1" = "xno"
+}
+
+show_help(){
+  echo "Usage: configure [options]"
+  echo "Options: [defaults in brackets after descriptions]"
+  echo "All \"enable\" options have \"disable\" counterparts"
+  echo
+  echo "  --help                    print this message"
+  echo "  --prefix=PREFIX           install in PREFIX [$PREFIX]"
+  echo "  --bindir=DIR              install binaries in DIR [$PREFIX/bin]"
+  echo "  --libdir=DIR              install libs in DIR [$PREFIX/lib]"
+  echo "  --incdir=DIR              install includes in DIR [$PREFIX/include]"
+  echo "  --enable-static           build static libraries [yes]"
+  echo "  --enable-shared           build shared libraries [no]"
+  echo "  --enable-msvc             create msvc-compatible import lib [auto]"
+  echo
+  echo "  --cc=CC                   use C compiler CC [$cc_default]"
+  echo "  --cross-prefix=PREFIX     use PREFIX for compilation tools [$cross_prefix]"
+  exit 1
+}
+
+die_unknown(){
+    echo "Unknown option \"$1\"."
+    echo "See $0 --help for available options."
+    exit 1
+}
+
+PREFIX="/mingw"
+ar="ar"
+cc_default="gcc"
+ranlib="ranlib"
+strip="strip"
+
+DEFAULT="msvc
+"
+
+DEFAULT_YES="static
+    stripping
+"
+
+DEFAULT_NO="shared
+"
+
+CMDLINE_SELECT="$DEFAULT
+    $DEFAULT_NO
+    $DEFAULT_YES
+"
+
+enable  $DEFAULT_YES
+disable $DEFAULT_NO
+
+for opt do
+    optval="${opt#*=}"
+    case "$opt" in
+    --help)
+        show_help
+    ;;
+    --prefix=*)
+        PREFIX="$optval"
+    ;;
+    --bindir=*)
+        bindir="$optval"
+    ;;
+    --libdir=*)
+        libdir="$optval"
+    ;;
+    --incdir=*)
+        incdir="$optval"
+    ;;
+    --cc=*)
+        cc="$optval"
+    ;;
+    --cross-prefix=*)
+        cross_prefix="$optval"
+    ;;
+    --enable-?*|--disable-?*)
+        eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
+        echo "$CMDLINE_SELECT" | grep -q "^ *$option\$" || die_unknown $opt
+        $action $option
+    ;;
+    *)
+        die_unknown $opt
+    ;;
+    esac
+done
+
+bindir="${PREFIX}/bin"
+libdir="${PREFIX}/lib"
+incdir="${PREFIX}/include/sys"
+ar="${cross_prefix}${ar}"
+cc_default="${cross_prefix}${cc_default}"
+ranlib="${cross_prefix}${ranlib}"
+strip="${cross_prefix}${strip}"
+
+if ! test -z $cc; then
+    cc_default="${cc}"
+fi
+cc="${cc_default}"
+
+disabled static && disabled shared && {
+    echo "At least one library type must be set.";
+    exit 1;
+}
+
+if enabled msvc; then
+    lib /? > /dev/null 2>&1 /dev/null || {
+        echo "MSVC's lib command not found."
+        echo "Make sure MSVC is installed and its bin folder is in your \$PATH."
+        exit 1
+    }
+fi
+
+if ! enabled stripping; then
+    strip="echo ignoring strip"
+fi
+
+enabled msvc && libcmd="lib" || libcmd="echo ignoring lib"
+
+echo "# Automatically generated by configure" > config.mak
+echo "PREFIX=$PREFIX" >> config.mak
+echo "bindir=$bindir" >> config.mak
+echo "libdir=$libdir" >> config.mak
+echo "incdir=$incdir" >> config.mak
+echo "AR=$ar" >> config.mak
+echo "CC=$cc" >> config.mak
+echo "RANLIB=$ranlib" >> config.mak
+echo "STRIP=$strip" >> config.mak
+echo "BUILD_STATIC=$static" >> config.mak
+echo "BUILD_SHARED=$shared" >> config.mak
+echo "BUILD_MSVC=$msvc" >> config.mak
+echo "LIBCMD=$libcmd" >> config.mak
+
+echo "prefix: $PREFIX"
+echo "bindir: $bindir"
+echo "libdir: $libdir"
+echo "incdir: $incdir"
+echo "ar:     $ar"
+echo "cc:     $cc"
+echo "ranlib: $ranlib"
+echo "strip:  $strip"
+echo "static: $static"
+echo "shared: $shared"
diff --git a/deps/mman/mman-win32.pro b/deps/mman/mman-win32.pro
new file mode 100644 (file)
index 0000000..b58b4d9
--- /dev/null
@@ -0,0 +1,13 @@
+QT -= core gui\r
+\r
+TARGET = mman\r
+TEMPLATE = lib\r
+\r
+DEFINES += MMAN_LIBRARY_DLL\r
+DEFINES += MMAN_LIBRARY\r
+\r
+HEADERS += \\r
+    mman.h\r
+\r
+SOURCES += \\r
+    mman.c\r
diff --git a/deps/mman/mman.c b/deps/mman/mman.c
new file mode 100644 (file)
index 0000000..e71666c
--- /dev/null
@@ -0,0 +1,185 @@
+
+#include <windows.h>
+#include <errno.h>
+#include <io.h>
+
+#include "mman.h"
+
+#ifndef FILE_MAP_EXECUTE
+#define FILE_MAP_EXECUTE    0x0020
+#endif /* FILE_MAP_EXECUTE */
+
+static int __map_mman_error(const DWORD err, const int deferr)
+{
+    if (err == 0)
+        return 0;
+    //TODO: implement
+    return err;
+}
+
+static DWORD __map_mmap_prot_page(const int prot)
+{
+    DWORD protect = 0;
+    
+    if (prot == PROT_NONE)
+        return protect;
+        
+    if ((prot & PROT_EXEC) != 0)
+    {
+        protect = ((prot & PROT_WRITE) != 0) ? 
+                    PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ;
+    }
+    else
+    {
+        protect = ((prot & PROT_WRITE) != 0) ?
+                    PAGE_READWRITE : PAGE_READONLY;
+    }
+    
+    return protect;
+}
+
+static DWORD __map_mmap_prot_file(const int prot)
+{
+    DWORD desiredAccess = 0;
+    
+    if (prot == PROT_NONE)
+        return desiredAccess;
+        
+    if ((prot & PROT_READ) != 0)
+        desiredAccess |= FILE_MAP_READ;
+    if ((prot & PROT_WRITE) != 0)
+        desiredAccess |= FILE_MAP_WRITE;
+    if ((prot & PROT_EXEC) != 0)
+        desiredAccess |= FILE_MAP_EXECUTE;
+    
+    return desiredAccess;
+}
+
+void* mmap(void *addr, size_t len, int prot, int flags, int fildes, OffsetType off)
+{
+    HANDLE fm, h;
+    
+    void * map = MAP_FAILED;
+    
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable: 4293)
+#endif
+
+    const DWORD dwFileOffsetLow = (sizeof(OffsetType) <= sizeof(DWORD)) ?
+                    (DWORD)off : (DWORD)(off & 0xFFFFFFFFL);
+    const DWORD dwFileOffsetHigh = (sizeof(OffsetType) <= sizeof(DWORD)) ?
+                    (DWORD)0 : (DWORD)((off >> 32) & 0xFFFFFFFFL);
+    const DWORD protect = __map_mmap_prot_page(prot);
+    const DWORD desiredAccess = __map_mmap_prot_file(prot);
+
+    const OffsetType maxSize = off + (OffsetType)len;
+
+    const DWORD dwMaxSizeLow = (sizeof(OffsetType) <= sizeof(DWORD)) ?
+                    (DWORD)maxSize : (DWORD)(maxSize & 0xFFFFFFFFL);
+    const DWORD dwMaxSizeHigh = (sizeof(OffsetType) <= sizeof(DWORD)) ?
+                    (DWORD)0 : (DWORD)((maxSize >> 32) & 0xFFFFFFFFL);
+
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+    errno = 0;
+    
+    if (len == 0 
+        /* Usupported protection combinations */
+        || prot == PROT_EXEC)
+    {
+        errno = EINVAL;
+        return MAP_FAILED;
+    }
+    
+    h = ((flags & MAP_ANONYMOUS) == 0) ? 
+                    (HANDLE)_get_osfhandle(fildes) : INVALID_HANDLE_VALUE;
+
+    if ((flags & MAP_ANONYMOUS) == 0 && h == INVALID_HANDLE_VALUE)
+    {
+        errno = EBADF;
+        return MAP_FAILED;
+    }
+
+    fm = CreateFileMapping(h, NULL, protect, dwMaxSizeHigh, dwMaxSizeLow, NULL);
+
+    if (fm == NULL)
+    {
+        errno = __map_mman_error(GetLastError(), EPERM);
+        return MAP_FAILED;
+    }
+  
+    if ((flags & MAP_FIXED) == 0)
+    {
+        map = MapViewOfFile(fm, desiredAccess, dwFileOffsetHigh, dwFileOffsetLow, len);
+    }
+    else
+    {
+        map = MapViewOfFileEx(fm, desiredAccess, dwFileOffsetHigh, dwFileOffsetLow, len, addr);
+    }
+
+    CloseHandle(fm);
+  
+    if (map == NULL)
+    {
+        errno = __map_mman_error(GetLastError(), EPERM);
+        return MAP_FAILED;
+    }
+
+    return map;
+}
+
+int munmap(void *addr, size_t len)
+{
+    if (UnmapViewOfFile(addr))
+        return 0;
+        
+    errno =  __map_mman_error(GetLastError(), EPERM);
+    
+    return -1;
+}
+
+int _mprotect(void *addr, size_t len, int prot)
+{
+    DWORD newProtect = __map_mmap_prot_page(prot);
+    DWORD oldProtect = 0;
+    
+    if (VirtualProtect(addr, len, newProtect, &oldProtect))
+        return 0;
+    
+    errno =  __map_mman_error(GetLastError(), EPERM);
+    
+    return -1;
+}
+
+int msync(void *addr, size_t len, int flags)
+{
+    if (FlushViewOfFile(addr, len))
+        return 0;
+    
+    errno =  __map_mman_error(GetLastError(), EPERM);
+    
+    return -1;
+}
+
+int mlock(const void *addr, size_t len)
+{
+    if (VirtualLock((LPVOID)addr, len))
+        return 0;
+        
+    errno =  __map_mman_error(GetLastError(), EPERM);
+    
+    return -1;
+}
+
+int munlock(const void *addr, size_t len)
+{
+    if (VirtualUnlock((LPVOID)addr, len))
+        return 0;
+        
+    errno =  __map_mman_error(GetLastError(), EPERM);
+    
+    return -1;
+}
diff --git a/deps/mman/mman.h b/deps/mman/mman.h
new file mode 100644 (file)
index 0000000..047d3a0
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * sys/mman.h
+ * mman-win32
+ */
+
+#ifndef _SYS_MMAN_H_
+#define _SYS_MMAN_H_
+
+#ifndef _WIN32_WINNT           // Allow use of features specific to Windows XP or later.                   
+#define _WIN32_WINNT 0x0501    // Change this to the appropriate value to target other versions of Windows.
+#endif                                         
+
+/* All the headers include this file. */
+#ifndef _MSC_VER
+#include <_mingw.h>
+#endif
+
+#if defined(MMAN_LIBRARY_DLL)
+/* Windows shared libraries (DLL) must be declared export when building the lib and import when building the 
+application which links against the library. */
+#if defined(MMAN_LIBRARY)
+#define MMANSHARED_EXPORT __declspec(dllexport)
+#else
+#define MMANSHARED_EXPORT __declspec(dllimport)
+#endif /* MMAN_LIBRARY */
+#else
+/* Static libraries do not require a __declspec attribute.*/
+#define MMANSHARED_EXPORT
+#endif /* MMAN_LIBRARY_DLL */
+
+/* Determine offset type */
+#include <stdint.h>
+#if defined(_WIN64)
+typedef int64_t OffsetType;
+#else
+typedef uint32_t OffsetType;
+#endif
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define PROT_NONE       0
+#define PROT_READ       1
+#define PROT_WRITE      2
+#define PROT_EXEC       4
+
+#define MAP_FILE        0
+#define MAP_SHARED      1
+#define MAP_PRIVATE     2
+#define MAP_TYPE        0xf
+#define MAP_FIXED       0x10
+#define MAP_ANONYMOUS   0x20
+#define MAP_ANON        MAP_ANONYMOUS
+
+#define MAP_FAILED      ((void *)-1)
+
+/* Flags for msync. */
+#define MS_ASYNC        1
+#define MS_SYNC         2
+#define MS_INVALIDATE   4
+
+MMANSHARED_EXPORT void*   mmap(void *addr, size_t len, int prot, int flags, int fildes, OffsetType off);
+MMANSHARED_EXPORT int     munmap(void *addr, size_t len);
+MMANSHARED_EXPORT int     _mprotect(void *addr, size_t len, int prot);
+MMANSHARED_EXPORT int     msync(void *addr, size_t len, int flags);
+MMANSHARED_EXPORT int     mlock(const void *addr, size_t len);
+MMANSHARED_EXPORT int     munlock(const void *addr, size_t len);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  _SYS_MMAN_H_ */
diff --git a/deps/mman/mman.sln b/deps/mman/mman.sln
new file mode 100644 (file)
index 0000000..69fb506
--- /dev/null
@@ -0,0 +1,28 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mman", "mman.vcxproj", "{592F578E-6F24-47C0-9F6C-07BC9B730E27}"
+EndProject
+Global
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution
+               Debug|x64 = Debug|x64
+               Debug|x86 = Debug|x86
+               Release|x64 = Release|x64
+               Release|x86 = Release|x86
+       EndGlobalSection
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution
+               {592F578E-6F24-47C0-9F6C-07BC9B730E27}.Debug|x64.ActiveCfg = Debug|x64
+               {592F578E-6F24-47C0-9F6C-07BC9B730E27}.Debug|x64.Build.0 = Debug|x64
+               {592F578E-6F24-47C0-9F6C-07BC9B730E27}.Debug|x86.ActiveCfg = Debug|Win32
+               {592F578E-6F24-47C0-9F6C-07BC9B730E27}.Debug|x86.Build.0 = Debug|Win32
+               {592F578E-6F24-47C0-9F6C-07BC9B730E27}.Release|x64.ActiveCfg = Release|x64
+               {592F578E-6F24-47C0-9F6C-07BC9B730E27}.Release|x64.Build.0 = Release|x64
+               {592F578E-6F24-47C0-9F6C-07BC9B730E27}.Release|x86.ActiveCfg = Release|Win32
+               {592F578E-6F24-47C0-9F6C-07BC9B730E27}.Release|x86.Build.0 = Release|Win32
+       EndGlobalSection
+       GlobalSection(SolutionProperties) = preSolution
+               HideSolutionNode = FALSE
+       EndGlobalSection
+EndGlobal
diff --git a/deps/mman/mman.vcxproj b/deps/mman/mman.vcxproj
new file mode 100644 (file)
index 0000000..e8dffa2
--- /dev/null
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{592F578E-6F24-47C0-9F6C-07BC9B730E27}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v140</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v140</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v140</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v140</PlatformToolset>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="Shared">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <Optimization>Disabled</Optimization>
+    </ClCompile>
+    <Link>
+      <TargetMachine>MachineX86</TargetMachine>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Console</SubSystem>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+    </ClCompile>
+    <Link>
+      <TargetMachine>MachineX86</TargetMachine>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Console</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+    </ClCompile>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+    </ClCompile>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClCompile Include="mman.c" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="mman.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="UpgradeLog.htm" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/deps/mman/mman.vcxproj.filters b/deps/mman/mman.vcxproj.filters
new file mode 100644 (file)
index 0000000..a08c8d5
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="Resource Files">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="mman.c">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="mman.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="UpgradeLog.htm" />
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/deps/mman/mman.vcxproj.user b/deps/mman/mman.vcxproj.user
new file mode 100644 (file)
index 0000000..abe8dd8
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup />
+</Project>
\ No newline at end of file
diff --git a/deps/mman/test.c b/deps/mman/test.c
new file mode 100644 (file)
index 0000000..9374b9f
--- /dev/null
@@ -0,0 +1,235 @@
+
+#include "mman.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+#ifndef NULL
+#define NULL    (void*)0
+#endif
+
+const char* map_file_name = "map_file.dat";
+
+int test_anon_map_readwrite()
+{    
+    void* map = mmap(NULL, 1024, PROT_READ | PROT_WRITE,
+                     MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+    if (map == MAP_FAILED)
+    {
+        printf("mmap (MAP_ANONYMOUS, PROT_READ | PROT_WRITE) returned unexpected error: %d\n", errno);
+        return -1;
+    }
+        
+    *((unsigned char*)map) = 1;
+    
+    int result = munmap(map, 1024);
+    
+    if (result != 0)
+        printf("munmap (MAP_ANONYMOUS, PROT_READ | PROT_WRITE) returned unexpected error: %d\n", errno);
+        
+    return result;
+}
+
+int test_anon_map_readonly()
+{    
+    void* map = mmap(NULL, 1024, PROT_READ,
+                     MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+    if (map == MAP_FAILED)
+    {
+        printf("mmap (MAP_ANONYMOUS, PROT_READ) returned unexpected error: %d\n", errno);
+        return -1;
+    }
+        
+    *((unsigned char*)map) = 1;
+    
+    int result = munmap(map, 1024);
+    
+    if (result != 0)
+        printf("munmap (MAP_ANONYMOUS, PROT_READ) returned unexpected error: %d\n", errno);
+        
+    return result;
+}
+
+int test_anon_map_writeonly()
+{    
+    void* map = mmap(NULL, 1024, PROT_WRITE,
+                     MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+    if (map == MAP_FAILED)
+    {
+        printf("mmap (MAP_ANONYMOUS, PROT_WRITE) returned unexpected error: %d\n", errno);
+        return -1;
+    }
+        
+    *((unsigned char*)map) = 1;
+    
+    int result = munmap(map, 1024);
+    
+    if (result != 0)
+        printf("munmap (MAP_ANONYMOUS, PROT_WRITE) returned unexpected error: %d\n", errno);
+        
+    return result;
+}
+
+int test_anon_map_readonly_nowrite()
+{    
+    void* map = mmap(NULL, 1024, PROT_READ,
+                     MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+    if (map == MAP_FAILED)
+    {
+        printf("mmap (MAP_ANONYMOUS, PROT_READ) returned unexpected error: %d\n", errno);
+        return -1;
+    }
+    
+    if (*((unsigned char*)map) != 0)
+        printf("test_anon_map_readonly_nowrite (MAP_ANONYMOUS, PROT_READ) returned unexpected value: %d\n", 
+                (int)*((unsigned char*)map));
+        
+    int result = munmap(map, 1024);
+    
+    if (result != 0)
+        printf("munmap (MAP_ANONYMOUS, PROT_READ) returned unexpected error: %d\n", errno);
+        
+    return result;
+}
+
+int test_file_map_readwrite()
+{
+    mode_t mode = S_IRUSR | S_IWUSR;
+    int o = open(map_file_name, O_TRUNC | O_BINARY | O_RDWR | O_CREAT, mode);
+
+    void* map = mmap(NULL, 1024, PROT_READ | PROT_WRITE, MAP_PRIVATE, o, 0);
+    if (map == MAP_FAILED)
+    {
+        printf("mmap returned unexpected error: %d\n", errno);
+        return -1;
+    }
+
+    *((unsigned char*)map) = 1;
+    
+    int result = munmap(map, 1024);
+    
+    if (result != 0)
+        printf("munmap returned unexpected error: %d\n", errno);
+    
+    close(o);
+    
+    /*TODO: get file info and content and compare it with the sources conditions */
+    unlink(map_file_name);
+    
+    return result;
+}
+
+int test_file_map_mlock_munlock()
+{
+    const size_t map_size = 1024;
+    
+    int result = 0;
+    mode_t mode = S_IRUSR | S_IWUSR;
+    int o = open(map_file_name, O_TRUNC | O_BINARY | O_RDWR | O_CREAT, mode);
+    if (o == -1)
+    {
+        printf("unable to create file %s: %d\n", map_file_name, errno);
+        return -1;
+    }
+
+    void* map = mmap(NULL, map_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, o, 0);
+    if (map == MAP_FAILED)
+    {
+        printf("mmap returned unexpected error: %d\n", errno);
+        result = -1;
+        goto done_close;
+    }
+     
+    if (mlock(map, map_size) != 0)
+    {
+        printf("mlock returned unexpected error: %d\n", errno);
+        result = -1;
+        goto done_munmap;        
+    }
+    
+    *((unsigned char*)map) = 1;
+    
+    if (munlock(map, map_size) != 0)
+    {
+        printf("munlock returned unexpected error: %d\n", errno);
+        result = -1;
+    }
+    
+done_munmap:
+    result = munmap(map, map_size);
+    
+    if (result != 0)
+        printf("munmap returned unexpected error: %d\n", errno);
+        
+done_close:
+    close(o);
+    
+    unlink(map_file_name);
+done:
+    return result;
+}
+
+int test_file_map_msync()
+{
+    const size_t map_size = 1024;
+    
+    int result = 0;
+    mode_t mode = S_IRUSR | S_IWUSR;
+    int o = open(map_file_name, O_TRUNC | O_BINARY | O_RDWR | O_CREAT, mode);
+    if (o == -1)
+    {
+        printf("unable to create file %s: %d\n", map_file_name, errno);
+        return -1;
+    }
+
+    void* map = mmap(NULL, map_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, o, 0);
+    if (map == MAP_FAILED)
+    {
+        printf("mmap returned unexpected error: %d\n", errno);
+        result = -1;
+        goto done_close;
+    }
+     
+    *((unsigned char*)map) = 1;
+
+    if (msync(map, map_size, MS_SYNC) != 0)
+    {
+        printf("msync returned unexpected error: %d\n", errno);
+        result = -1;
+    }
+    
+    result = munmap(map, map_size);
+    
+    if (result != 0)
+        printf("munmap returned unexpected error: %d\n", errno);
+        
+done_close:
+    close(o);
+    
+    unlink(map_file_name);
+done:
+    return result;
+}
+
+#define EXEC_TEST(name) \
+    if (name() != 0) { result = -1; printf( #name ": fail\n"); } \
+    else { printf(#name ": pass\n"); }
+
+int main()
+{
+    int result = 0;
+    
+    EXEC_TEST(test_anon_map_readwrite);
+    //NOTE: this test must cause an access violation exception
+    //EXEC_TEST(test_anon_map_readonly);
+    EXEC_TEST(test_anon_map_readonly_nowrite);
+    EXEC_TEST(test_anon_map_writeonly);
+    
+    EXEC_TEST(test_file_map_readwrite);
+    EXEC_TEST(test_file_map_mlock_munlock);
+    EXEC_TEST(test_file_map_msync);
+    //TODO: EXEC_TEST(test_file_map_mprotect);
+    
+    return result;
+}