diff options
author | 2013-06-25 14:25:01 +0900 | |
---|---|---|
committer | 2013-06-25 16:03:33 +0900 | |
commit | f3b62900c7bcb0d6434f45ec7b467b7b4bad6f9a (patch) | |
tree | 5a7e6f8d2697e5b69ea30e59003908ec1575a2e1 /native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp | |
parent | 46159d5422b9fd92969f522fa51c7601d531927a (diff) | |
download | latinime-f3b62900c7bcb0d6434f45ec7b467b7b4bad6f9a.tar.gz latinime-f3b62900c7bcb0d6434f45ec7b467b7b4bad6f9a.tar.xz latinime-f3b62900c7bcb0d6434f45ec7b467b7b4bad6f9a.zip |
Allow mmapping dictionary file in writable mode in openNative.
Bug: 6669677
Change-Id: I447668932de118b158fa029ddc977b3f3cc06cb8
Diffstat (limited to 'native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp')
-rw-r--r-- | native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp index cbe7ce451..b856718c6 100644 --- a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp +++ b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp @@ -40,7 +40,7 @@ class ProximityInfo; static void releaseDictBuf(const void *dictBuf, const size_t length, const int fd); static jlong latinime_BinaryDictionary_open(JNIEnv *env, jclass clazz, jstring sourceDir, - jlong dictOffset, jlong dictSize) { + jlong dictOffset, jlong dictSize, jboolean isUpdatable) { PROF_OPEN; PROF_START(66); const jsize sourceDirUtf8Length = env->GetStringUTFLength(sourceDir); @@ -54,7 +54,9 @@ static jlong latinime_BinaryDictionary_open(JNIEnv *env, jclass clazz, jstring s int fd = 0; void *dictBuf = 0; int offset = 0; - fd = open(sourceDirChars, O_RDONLY); + const bool updatableMmap = (isUpdatable == JNI_TRUE); + const int openMode = updatableMmap ? O_RDWR : O_RDONLY; + fd = open(sourceDirChars, openMode); if (fd < 0) { AKLOGE("DICT: Can't open sourceDir. sourceDirChars=%s errno=%d", sourceDirChars, errno); return 0; @@ -63,7 +65,8 @@ static jlong latinime_BinaryDictionary_open(JNIEnv *env, jclass clazz, jstring s offset = static_cast<int>(dictOffset) % pagesize; int adjDictOffset = static_cast<int>(dictOffset) - offset; int adjDictSize = static_cast<int>(dictSize) + offset; - dictBuf = mmap(0, adjDictSize, PROT_READ, MAP_PRIVATE, fd, adjDictOffset); + const int protMode = updatableMmap ? PROT_READ | PROT_WRITE : PROT_READ; + dictBuf = mmap(0, adjDictSize, protMode, MAP_PRIVATE, fd, adjDictOffset); if (dictBuf == MAP_FAILED) { AKLOGE("DICT: Can't mmap dictionary. errno=%d", errno); return 0; @@ -80,7 +83,8 @@ static jlong latinime_BinaryDictionary_open(JNIEnv *env, jclass clazz, jstring s AKLOGE("DICT: dictionary format is unknown, bad magic number"); releaseDictBuf(static_cast<const char *>(dictBuf) - offset, adjDictSize, fd); } else { - dictionary = new Dictionary(dictBuf, static_cast<int>(dictSize), fd, offset); + dictionary = new Dictionary( + dictBuf, static_cast<int>(dictSize), fd, offset, updatableMmap); } PROF_END(66); PROF_CLOSE; @@ -245,7 +249,7 @@ static void releaseDictBuf(const void *dictBuf, const size_t length, const int f static const JNINativeMethod sMethods[] = { { const_cast<char *>("openNative"), - const_cast<char *>("(Ljava/lang/String;JJ)J"), + const_cast<char *>("(Ljava/lang/String;JJZ)J"), reinterpret_cast<void *>(latinime_BinaryDictionary_open) }, { |