You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/08/31 19:35:53 UTC

svn commit: r809669 - in /commons/sandbox/runtime/trunk/src/main/native/os: unix/pmmap.c win32/pmmap.c

Author: mturk
Date: Mon Aug 31 17:35:53 2009
New Revision: 809669

URL: http://svn.apache.org/viewvc?rev=809669&view=rev
Log:
MMap api implementations

Modified:
    commons/sandbox/runtime/trunk/src/main/native/os/unix/pmmap.c
    commons/sandbox/runtime/trunk/src/main/native/os/win32/pmmap.c

Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/pmmap.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/pmmap.c?rev=809669&r1=809668&r2=809669&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/pmmap.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/pmmap.c Mon Aug 31 17:35:53 2009
@@ -77,6 +77,16 @@
     return rc;
 }
 
+static int mmap_pointer_cleanup(void *address, size_t length)
+{
+    if (!length || IS_INVALID_HANDLE(address))
+        return ACR_EBADF;
+    if (munmap(address, length))
+        return ACR_GET_OS_ERROR();
+    else
+        return 0;
+}
+
 static int mmap_descriptor_cleanup(ACR_JNISTDARGS,
                                    acr_descriptor_cb_type_e cm,
                                    acr_descriptor_cb_t *dp)

Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/pmmap.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/pmmap.c?rev=809669&r1=809668&r2=809669&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/pmmap.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/pmmap.c Mon Aug 31 17:35:53 2009
@@ -77,6 +77,16 @@
     return rc;
 }
 
+static int mmap_pointer_cleanup(void *address, size_t length)
+{
+    if (!length || IS_INVALID_HANDLE(address))
+        return ACR_EBADF;
+    if (!UnmapViewOfFile(address))
+        return ACR_GET_OS_ERROR();
+    else
+        return 0;
+}
+
 static int mmap_descriptor_cleanup(ACR_JNISTDARGS,
                                    acr_descriptor_cb_type_e cm,
                                    acr_descriptor_cb_t *dp)
@@ -131,6 +141,7 @@
     int rc;
     acr_mmap_t *map;
     acr_file_t *file;
+    DWORD prot = 0;
 
     file = (acr_file_t *)ACR_IOH(fd);
     if (ACR_IOH_TYPE(fd) != ACR_DT_FILE) {
@@ -147,18 +158,26 @@
 
     map->fd = file->fd;
     if (flags & ACR_FOPEN_READ) {
-        if (flags & ACR_FOPEN_EXEC)
-            map->flags = PAGE_EXECUTE_READ;
-        else
-            map->flags = PAGE_READONLY;
+        if (flags & ACR_FOPEN_EXEC) {
+            prot       = PAGE_EXECUTE_READ;
+            map->flags = FILE_MAP_READ | FILE_MAP_EXECUTE;
+        }
+        else {
+            prot       = PAGE_READONLY;
+            map->flags = FILE_MAP_READ;
+        }
     }
     if (flags & ACR_FOPEN_WRITE) {
-        if (flags & ACR_FOPEN_EXEC)
-            map->flags = PAGE_EXECUTE_READWRITE;
-        else
-            map->flags = PAGE_READWRITE;
+        if (flags & ACR_FOPEN_EXEC) {
+            prot       = PAGE_EXECUTE_READWRITE;
+            map->flags = FILE_MAP_ALL_ACCESS | FILE_MAP_EXECUTE;
+        }
+        else {
+            prot       = PAGE_READWRITE;
+            map->flags = FILE_MAP_ALL_ACCESS;
+        }
     }
-    map->mh = CreateFileMappingW(map->fd, NULL, map->flags, 0, 0, NULL);
+    map->mh = CreateFileMappingW(map->fd, NULL, prot, 0, 0, NULL);
     if (IS_INVALID_HANDLE(map->mh)) {
         rc = ACR_GET_OS_ERROR();
         free(map);
@@ -174,6 +193,7 @@
 {
     int rc;
     DWORD mode = 0;
+    DWORD prot = 0;
     acr_mmap_t *map;
 
     map = ACR_Calloc(_E, THROW_FMARK, sizeof(acr_mmap_t));
@@ -181,17 +201,25 @@
         return -1;
 
     if (flags & ACR_FOPEN_READ) {
-        if (flags & ACR_FOPEN_EXEC)
-            map->flags = PAGE_EXECUTE_READ;
-        else
-            map->flags = PAGE_READONLY;
+        if (flags & ACR_FOPEN_EXEC) {
+            prot       = PAGE_EXECUTE_READ;
+            map->flags = FILE_MAP_READ | FILE_MAP_EXECUTE;
+        }
+        else {
+            prot       = PAGE_READONLY;
+            map->flags = FILE_MAP_READ;
+        }
         mode = GENERIC_READ;
     }
     if (flags & ACR_FOPEN_WRITE) {
-        if (flags & ACR_FOPEN_EXEC)
-            map->flags = PAGE_EXECUTE_READWRITE;
-        else
-            map->flags = PAGE_READWRITE;
+        if (flags & ACR_FOPEN_EXEC) {
+            prot       = PAGE_EXECUTE_READWRITE;
+            map->flags = FILE_MAP_ALL_ACCESS | FILE_MAP_EXECUTE;
+        }
+        else {
+            prot       = PAGE_READWRITE;
+            map->flags = FILE_MAP_ALL_ACCESS;
+        }
         mode = GENERIC_READ | GENERIC_WRITE;
     }
     map->fd = CreateFileW(filename,
@@ -207,7 +235,7 @@
         ACR_SET_OS_ERROR(rc);
         return -1;
     }
-    map->mh = CreateFileMappingW(map->fd, NULL, map->flags, 0, 0, NULL);
+    map->mh = CreateFileMappingW(map->fd, NULL, prot, 0, 0, NULL);
     if (IS_INVALID_HANDLE(map->mh)) {
         rc = ACR_GET_OS_ERROR();
         CloseHandle(map->fd);
@@ -219,6 +247,64 @@
     return rc;
 }
 
+ACR_DECLARE(void *) ACR_MMap(JNIEnv *_E, int map, acr_off_t offset,
+                             acr_size_t size)
+{
+    LARGE_INTEGER off;
+    acr_mmap_t *m = (acr_mmap_t *)ACR_IOH(map);
+
+    if (ACR_IOH_TYPE(map) != ACR_DT_MMAP) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_EINVAL, ACR_EFTYPE);
+        return NULL;
+    }
+    if (IS_VALID_HANDLE(m->base)) {
+        /* Already mapped.
+         */
+        if (m->offset == offset && m->size == size) {
+            /* Return reference to existing map
+             * if this is the same region.
+             */
+            return m->base;
+        }
+        ACR_THROW_IO_IF_ERR(ACR_EEXIST);
+        return NULL;
+    }
+    off.QuadValue = offset;
+    m->base = MapViewOfFile(m->md, m->flags, off.HighPart, off.LowPart, size);
+    if (IS_INVALID_HANDLE(m->base)) {
+        ACR_THROW_IO_ERRNO();
+        return NULL;
+    }
+    m->offset = offset;
+    m->size   = size;
+
+    return m->base;
+}
+
+ACR_DECLARE(int) ACR_MUnmap(JNIEnv *_E, int map)
+{
+    acr_mmap_t *m = (acr_mmap_t *)ACR_IOH(map);
+
+    if (ACR_IOH_TYPE(map) != ACR_DT_MMAP) {
+        ACR_THROW_EX_IF_ERR(ACR_EX_EINVAL, ACR_EFTYPE);
+        return ACR_EFTYPE;
+    }
+    if (IS_INVALID_HANDLE(m->base)) {
+        ACR_THROW_IO_IF_ERR(ACR_EBADF);
+        return ACR_EBADF;
+    }
+    if (UnmapViewOfFile(m->base)) {
+        m->base = NULL;
+        ACR_THROW_IO_ERRNO();
+        return ACR_GET_OS_ERROR();
+    }
+    m->base   = NULL;
+    m->offset = 0;
+    m->size   = 0;
+
+    return 0;
+}
+
 ACR_CLASS_LDEF(io_MemoryMappedFile)
 {
     int rv;