aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--java/src/com/android/inputmethod/latin/BinaryDictionary.java5
-rw-r--r--native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp35
-rw-r--r--native/jni/src/suggest/core/dictionary/binary_dictionary_info.h30
-rw-r--r--native/jni/src/suggest/core/dictionary/dictionary.cpp7
-rw-r--r--native/jni/src/suggest/core/dictionary/dictionary.h11
5 files changed, 55 insertions, 33 deletions
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index 05b1a2ee1..4425d7d25 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -91,7 +91,8 @@ public final class BinaryDictionary extends Dictionary {
JniUtils.loadNativeLibrary();
}
- private static native long openNative(String sourceDir, long dictOffset, long dictSize);
+ private static native long openNative(String sourceDir, long dictOffset, long dictSize,
+ boolean isUpdatable);
private static native void closeNative(long dict);
private static native int getProbabilityNative(long dict, int[] word);
private static native boolean isValidBigramNative(long dict, int[] word1, int[] word2);
@@ -106,7 +107,7 @@ public final class BinaryDictionary extends Dictionary {
// TODO: Move native dict into session
private final void loadDictionary(final String path, final long startOffset,
final long length) {
- mNativeDict = openNative(path, startOffset, length);
+ mNativeDict = openNative(path, startOffset, length, false /* isUpdatable */);
}
@Override
diff --git a/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp b/native/jni/com_android_inputmethod_latin_BinaryDictionary.cpp
index 1225e7f7a..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);
@@ -53,22 +53,25 @@ static jlong latinime_BinaryDictionary_open(JNIEnv *env, jclass clazz, jstring s
sourceDirChars[sourceDirUtf8Length] = '\0';
int fd = 0;
void *dictBuf = 0;
- int adjust = 0;
- fd = open(sourceDirChars, O_RDONLY);
+ int offset = 0;
+ 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;
}
int pagesize = getpagesize();
- adjust = static_cast<int>(dictOffset) % pagesize;
- int adjDictOffset = static_cast<int>(dictOffset) - adjust;
- int adjDictSize = static_cast<int>(dictSize) + adjust;
- dictBuf = mmap(0, adjDictSize, PROT_READ, MAP_PRIVATE, fd, adjDictOffset);
+ offset = static_cast<int>(dictOffset) % pagesize;
+ int adjDictOffset = static_cast<int>(dictOffset) - offset;
+ int adjDictSize = static_cast<int>(dictSize) + offset;
+ 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;
}
- dictBuf = static_cast<char *>(dictBuf) + adjust;
+ dictBuf = static_cast<char *>(dictBuf) + offset;
if (!dictBuf) {
AKLOGE("DICT: dictBuf is null");
return 0;
@@ -78,9 +81,10 @@ static jlong latinime_BinaryDictionary_open(JNIEnv *env, jclass clazz, jstring s
== BinaryDictionaryFormat::detectFormatVersion(static_cast<uint8_t *>(dictBuf),
static_cast<int>(dictSize))) {
AKLOGE("DICT: dictionary format is unknown, bad magic number");
- releaseDictBuf(static_cast<const char *>(dictBuf) - adjust, adjDictSize, fd);
+ releaseDictBuf(static_cast<const char *>(dictBuf) - offset, adjDictSize, fd);
} else {
- dictionary = new Dictionary(dictBuf, static_cast<int>(dictSize), fd, adjust);
+ dictionary = new Dictionary(
+ dictBuf, static_cast<int>(dictSize), fd, offset, updatableMmap);
}
PROF_END(66);
PROF_CLOSE;
@@ -221,10 +225,13 @@ static jint latinime_BinaryDictionary_editDistance(JNIEnv *env, jclass clazz, ji
static void latinime_BinaryDictionary_close(JNIEnv *env, jclass clazz, jlong dict) {
Dictionary *dictionary = reinterpret_cast<Dictionary *>(dict);
if (!dictionary) return;
- const void *dictBuf = dictionary->getBinaryDictionaryInfo()->getDictBuf();
+ const BinaryDictionaryInfo *const binaryDictionaryInfo = dictionary->getBinaryDictionaryInfo();
+ const int dictBufOffset = binaryDictionaryInfo->getDictBufOffset();
+ const void *dictBuf = binaryDictionaryInfo->getDictBuf();
if (!dictBuf) return;
- releaseDictBuf(static_cast<const char *>(dictBuf) - dictionary->getDictBufAdjust(),
- dictionary->getDictSize() + dictionary->getDictBufAdjust(), dictionary->getMmapFd());
+ releaseDictBuf(static_cast<const char *>(dictBuf) - dictBufOffset,
+ binaryDictionaryInfo->getDictSize() + dictBufOffset,
+ binaryDictionaryInfo->getMmapFd());
delete dictionary;
}
@@ -242,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)
},
{
diff --git a/native/jni/src/suggest/core/dictionary/binary_dictionary_info.h b/native/jni/src/suggest/core/dictionary/binary_dictionary_info.h
index 0b77e5ee9..e0b583588 100644
--- a/native/jni/src/suggest/core/dictionary/binary_dictionary_info.h
+++ b/native/jni/src/suggest/core/dictionary/binary_dictionary_info.h
@@ -29,15 +29,29 @@ class BinaryDictionaryHeader;
class BinaryDictionaryInfo {
public:
- BinaryDictionaryInfo(const uint8_t *const dictBuf, const int dictSize)
- : mDictBuf(dictBuf),
- mDictionaryFormat(BinaryDictionaryFormat::detectFormatVersion(mDictBuf, dictSize)),
+ BinaryDictionaryInfo(const uint8_t *const dictBuf, const int dictSize, const int mmapFd,
+ const int dictBufOffset, const bool isUpdatable)
+ : mDictBuf(dictBuf), mDictSize(dictSize), mMmapFd(mmapFd),
+ mDictBufOffset(dictBufOffset), mIsUpdatable(isUpdatable),
+ mDictionaryFormat(BinaryDictionaryFormat::detectFormatVersion(mDictBuf, mDictSize)),
mDictionaryHeader(this), mDictRoot(mDictBuf + mDictionaryHeader.getSize()) {}
AK_FORCE_INLINE const uint8_t *getDictBuf() const {
return mDictBuf;
}
+ AK_FORCE_INLINE int getDictSize() const {
+ return mDictSize;
+ }
+
+ AK_FORCE_INLINE int getMmapFd() const {
+ return mMmapFd;
+ }
+
+ AK_FORCE_INLINE int getDictBufOffset() const {
+ return mDictBufOffset;
+ }
+
AK_FORCE_INLINE const uint8_t *getDictRoot() const {
return mDictRoot;
}
@@ -54,10 +68,20 @@ class BinaryDictionaryInfo {
return &mDictionaryHeader;
}
+ AK_FORCE_INLINE bool isDynamicallyUpdatable() const {
+ // TODO: Support dynamic dictionary formats.
+ const bool isUpdatableDictionaryFormat = false;
+ return mIsUpdatable && isUpdatableDictionaryFormat;
+ }
+
private:
DISALLOW_COPY_AND_ASSIGN(BinaryDictionaryInfo);
const uint8_t *const mDictBuf;
+ const int mDictSize;
+ const int mMmapFd;
+ const int mDictBufOffset;
+ const bool mIsUpdatable;
const BinaryDictionaryFormat::FORMAT_VERSION mDictionaryFormat;
const BinaryDictionaryHeader mDictionaryHeader;
const uint8_t *const mDictRoot;
diff --git a/native/jni/src/suggest/core/dictionary/dictionary.cpp b/native/jni/src/suggest/core/dictionary/dictionary.cpp
index 27b052b7e..028b61506 100644
--- a/native/jni/src/suggest/core/dictionary/dictionary.cpp
+++ b/native/jni/src/suggest/core/dictionary/dictionary.cpp
@@ -32,10 +32,9 @@
namespace latinime {
-Dictionary::Dictionary(void *dict, int dictSize, int mmapFd, int dictBufAdjust)
- : mBinaryDictionaryInfo(static_cast<const uint8_t *>(dict), dictSize),
- mDictSize(dictSize),
- mMmapFd(mmapFd), mDictBufAdjust(dictBufAdjust),
+Dictionary::Dictionary(void *dict, int dictSize, int mmapFd, int dictBufOffset, bool isUpdatable)
+ : mBinaryDictionaryInfo(static_cast<const uint8_t *>(dict), dictSize, mmapFd,
+ dictBufOffset, isUpdatable),
mBigramDictionary(new BigramDictionary(&mBinaryDictionaryInfo)),
mGestureSuggest(new Suggest(GestureSuggestPolicyFactory::getGestureSuggestPolicy())),
mTypingSuggest(new Suggest(TypingSuggestPolicyFactory::getTypingSuggestPolicy())) {
diff --git a/native/jni/src/suggest/core/dictionary/dictionary.h b/native/jni/src/suggest/core/dictionary/dictionary.h
index 151f26183..afd081841 100644
--- a/native/jni/src/suggest/core/dictionary/dictionary.h
+++ b/native/jni/src/suggest/core/dictionary/dictionary.h
@@ -52,7 +52,7 @@ class Dictionary {
static const int KIND_FLAG_POSSIBLY_OFFENSIVE = 0x80000000;
static const int KIND_FLAG_EXACT_MATCH = 0x40000000;
- Dictionary(void *dict, int dictSize, int mmapFd, int dictBufAdjust);
+ Dictionary(void *dict, int dictSize, int mmapFd, int dictBufOffset, bool isUpdatable);
int getSuggestions(ProximityInfo *proximityInfo, DicTraverseSession *traverseSession,
int *xcoordinates, int *ycoordinates, int *times, int *pointerIds, int *inputCodePoints,
@@ -68,21 +68,12 @@ class Dictionary {
const BinaryDictionaryInfo *getBinaryDictionaryInfo() const {
return &mBinaryDictionaryInfo;
}
- int getDictSize() const { return mDictSize; }
- int getMmapFd() const { return mMmapFd; }
- int getDictBufAdjust() const { return mDictBufAdjust; }
virtual ~Dictionary();
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(Dictionary);
const BinaryDictionaryInfo mBinaryDictionaryInfo;
- // Used only for the mmap version of dictionary loading, but we use these as dummy variables
- // also for the malloc version.
- const int mDictSize;
- const int mMmapFd;
- const int mDictBufAdjust;
-
const BigramDictionary *mBigramDictionary;
SuggestInterface *mGestureSuggest;
SuggestInterface *mTypingSuggest;