diff options
3 files changed, 42 insertions, 58 deletions
diff --git a/luni/src/main/java/org/apache/harmony/luni/platform/IMemorySystem.java b/luni/src/main/java/org/apache/harmony/luni/platform/IMemorySystem.java index 6e8028a..f7a0209 100644 --- a/luni/src/main/java/org/apache/harmony/luni/platform/IMemorySystem.java +++ b/luni/src/main/java/org/apache/harmony/luni/platform/IMemorySystem.java @@ -515,7 +515,7 @@ public interface IMemorySystem { * * @param fileDescriptor * a handle to the file that is to be memory mapped. - * @param alignment + * @param offset * the offset in the file where the mapping should begin. * @param size * the number of bytes that are requested to map. @@ -528,8 +528,10 @@ public interface IMemorySystem { * @throws IOException * if an exception occurs mapping the file into memory. */ - public int mmap(int fileDescriptor, long alignment, long size, int mapMode) + // BEGIN android-changed: rename 'alignment' to 'offset'. + public int mmap(int fileDescriptor, long offset, long size, int mapMode) throws IOException; + // END android-changed /** * TODO: JavaDoc diff --git a/luni/src/main/java/org/apache/harmony/luni/platform/OSMemory.java b/luni/src/main/java/org/apache/harmony/luni/platform/OSMemory.java index 8d06b1c..b490da5 100644 --- a/luni/src/main/java/org/apache/harmony/luni/platform/OSMemory.java +++ b/luni/src/main/java/org/apache/harmony/luni/platform/OSMemory.java @@ -608,18 +608,17 @@ final class OSMemory implements IMemorySystem { */ public native void setAddress(int address, int value); - /* - * Memory mapped file - */ - private native int mmapImpl(int fileDescriptor, long alignment, - long size, int mapMode); - - public int mmap(int fileDescriptor, long alignment, long size, - int mapMode) throws IOException { - // No need to check mmapImpl return as it throws IOException in error cases - int address = mmapImpl(fileDescriptor, alignment, size, mapMode); - return address; + // BEGIN android-changed: more error checking, rename 'alignment' to 'offset'. + private native int mmapImpl(int fd, long offset, long size, int mapMode); + + public int mmap(int fd, long offset, long size, int mapMode) throws IOException { + // Check just those errors mmap(2) won't detect. + if (offset < 0 || size < 0 || offset > Integer.MAX_VALUE || size > Integer.MAX_VALUE) { + throw new IllegalArgumentException("offset=" + offset + " size=" + size); + } + return mmapImpl(fd, offset, size, mapMode); } + // END android-changed private native void unmapImpl(int addr, long size); diff --git a/luni/src/main/native/org_apache_harmony_luni_platform_OSMemory.cpp b/luni/src/main/native/org_apache_harmony_luni_platform_OSMemory.cpp index b1493f8..1d63faf 100644 --- a/luni/src/main/native/org_apache_harmony_luni_platform_OSMemory.cpp +++ b/luni/src/main/native/org_apache_harmony_luni_platform_OSMemory.cpp @@ -34,12 +34,9 @@ static struct { jobject runtimeInstance; } gIDCache; -#undef MMAP_READ_ONLY -#define MMAP_READ_ONLY 1L -#undef MMAP_READ_WRITE -#define MMAP_READ_WRITE 2L -#undef MMAP_WRITE_COPY -#define MMAP_WRITE_COPY 4L +static const int MMAP_READ_ONLY = 1; +static const int MMAP_READ_WRITE = 2; +static const int MMAP_WRITE_COPY = 4; /* * Class: org_apache_harmony_luni_platform_OSMemory @@ -429,36 +426,33 @@ static void harmony_nio_setAddress(JNIEnv *_env, jobject _this, jint pointer, * Method: mmapImpl * Signature: (IJJI)I */ -static jint harmony_nio_mmapImpl(JNIEnv *_env, jobject _this, jint fd, - jlong alignment, jlong size, jint mmode) { - void *mapAddress = NULL; +static jint harmony_nio_mmapImpl(JNIEnv* env, jobject, jint fd, + jlong offset, jlong size, jint mapMode) { int prot, flags; - - // Convert from Java mapping mode to port library mapping mode. - switch (mmode) { - case MMAP_READ_ONLY: - prot = PROT_READ; - flags = MAP_SHARED; - break; - case MMAP_READ_WRITE: - prot = PROT_READ|PROT_WRITE; - flags = MAP_SHARED; - break; - case MMAP_WRITE_COPY: - prot = PROT_READ|PROT_WRITE; - flags = MAP_PRIVATE; - break; - default: - return -1; + switch (mapMode) { + case MMAP_READ_ONLY: + prot = PROT_READ; + flags = MAP_SHARED; + break; + case MMAP_READ_WRITE: + prot = PROT_READ|PROT_WRITE; + flags = MAP_SHARED; + break; + case MMAP_WRITE_COPY: + prot = PROT_READ|PROT_WRITE; + flags = MAP_PRIVATE; + break; + default: + jniThrowIOException(env, EINVAL); + LOGE("bad mapMode %i", mapMode); + return -1; } - mapAddress = mmap(0, (size_t)(size&0x7fffffff), prot, flags,fd, - (off_t)(alignment&0x7fffffff)); + void* mapAddress = mmap(0, size, prot, flags, fd, offset); if (mapAddress == MAP_FAILED) { - return -1; + jniThrowIOException(env, errno); } - - return (jint) mapAddress; + return reinterpret_cast<uintptr_t>(mapAddress); } /* @@ -494,15 +488,6 @@ static jint harmony_nio_loadImpl(JNIEnv *_env, jobject _this, jint address, return -1; } -int getPageSize() { - static int page_size = 0; - if(page_size==0) - { - page_size=getpagesize(); - } - return page_size; -} - /* * Class: org_apache_harmony_luni_platform_OSMemory * Method: isLoadedImpl @@ -511,18 +496,16 @@ int getPageSize() { static jboolean harmony_nio_isLoadedImpl(JNIEnv *_env, jobject _this, jint address, jlong size) { + static int page_size = getpagesize(); jboolean result = 0; jint m_addr = (jint)address; - int page_size = getPageSize(); - unsigned char* vec = NULL; - int page_count = 0; int align_offset = m_addr%page_size;// addr should align with the boundary of a page. m_addr -= align_offset; size += align_offset; - page_count = (size+page_size-1)/page_size; + int page_count = (size+page_size-1)/page_size; - vec = (unsigned char *) malloc(page_count*sizeof(char)); + unsigned char* vec = (unsigned char *) malloc(page_count*sizeof(char)); if (mincore((void *)m_addr, size, (MINCORE_POINTER_TYPE) vec)==0) { // or else there is error about the mincore and return false; |