aboutsummaryrefslogtreecommitdiffstats
path: root/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
diff options
context:
space:
mode:
authorKeisuke Kuroynagi <ksk@google.com>2013-06-25 14:25:01 +0900
committerKeisuke Kuroynagi <ksk@google.com>2013-06-25 16:03:33 +0900
commitf3b62900c7bcb0d6434f45ec7b467b7b4bad6f9a (patch)
tree5a7e6f8d2697e5b69ea30e59003908ec1575a2e1 /native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
parent46159d5422b9fd92969f522fa51c7601d531927a (diff)
downloadlatinime-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.cpp14
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)
},
{