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;