diff options
author | 2013-12-02 16:11:25 +0900 | |
---|---|---|
committer | 2013-12-02 16:11:25 +0900 | |
commit | 11765ee804ee8af7e3d28e97ca41c746a07c97e3 (patch) | |
tree | 7b855c11c11c1edee74f0b9e143149e632401f8d | |
parent | 5c48f1970a7bdb358a0ade4a40c36de82f90304f (diff) | |
download | latinime-11765ee804ee8af7e3d28e97ca41c746a07c97e3.tar.gz latinime-11765ee804ee8af7e3d28e97ca41c746a07c97e3.tar.xz latinime-11765ee804ee8af7e3d28e97ca41c746a07c97e3.zip |
Fix: ver4 bigram GC.
Bug: 11073222
Change-Id: I1637525ead60026cdf75ac90d40f97d02ce44ea1
-rw-r--r-- | native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/bigram_dict_content.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/bigram_dict_content.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/bigram_dict_content.cpp index 4cd96722e..431f342ae 100644 --- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/bigram_dict_content.cpp +++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/content/bigram_dict_content.cpp @@ -46,6 +46,7 @@ bool BigramDictContent::writeBigramEntryAndAdvancePosition(const int probability const int bigramFlags = createAndGetBigramFlags(probability, hasNext); if (!bigramListBuffer->writeUintAndAdvancePosition(bigramFlags, Ver4DictConstants::BIGRAM_FLAGS_FIELD_SIZE, entryWritingPos)) { + AKLOGE("Cannot write bigram flags. pos: %d, flags: %x", *entryWritingPos, bigramFlags); return false; } const int targetTerminalIdToWrite = @@ -66,6 +67,7 @@ bool BigramDictContent::copyBigramList(const int bigramListPos, const int toPos) &readingPos); if (!writeBigramEntryAndAdvancePosition(probability, hasNext, targetTerminalId, &writingPos)) { + AKLOGE("Cannot write bigram entry to copy. pos: %d", writingPos); return false; } } @@ -88,6 +90,8 @@ bool BigramDictContent::runGC(const TerminalPositionLookupTable::TerminalIdMap * // Copy bigram list with GC from original content. if (!runGCBigramList(originalBigramListPos, originalBigramDictContent, bigramListPos, terminalIdMap, &bigramEntryCount)) { + AKLOGE("Cannot complete GC for the bigram list. original pos: %d, pos: %d", + originalBigramListPos, bigramListPos); return false; } if (bigramEntryCount == 0) { @@ -97,6 +101,8 @@ bool BigramDictContent::runGC(const TerminalPositionLookupTable::TerminalIdMap * *outBigramEntryCount += bigramEntryCount; // Set bigram list position to the lookup table. if (!getUpdatableAddressLookupTable()->set(it->second, bigramListPos)) { + AKLOGE("Cannot set bigram list position. terminal id: %d, pos: %d", + it->second, bigramListPos); return false; } } @@ -111,6 +117,7 @@ bool BigramDictContent::runGCBigramList(const int bigramListPos, bool hasNext = true; int readingPos = bigramListPos; int writingPos = toPos; + int lastEntryPos = NOT_A_DICT_POS; while (hasNext) { int probability = NOT_A_PROBABILITY; int targetTerminalId = Ver4DictConstants::NOT_A_TERMINAL_ID; @@ -125,12 +132,24 @@ bool BigramDictContent::runGCBigramList(const int bigramListPos, // Target word has been removed. continue; } + lastEntryPos = hasNext ? writingPos : NOT_A_DICT_POS; if (!writeBigramEntryAndAdvancePosition(probability, hasNext, it->second, &writingPos)) { + AKLOGE("Cannot write bigram entry to run GC. pos: %d", writingPos); return false; } *outEntrycount += 1; } + if (lastEntryPos != NOT_A_DICT_POS) { + // Update has next flag in the last written entry. + int probability = NOT_A_PROBABILITY; + int targetTerminalId = Ver4DictConstants::NOT_A_TERMINAL_ID; + getBigramEntry(&probability, 0 /* outHasNext */, &targetTerminalId, lastEntryPos); + if (!writeBigramEntry(probability, false /* hasNext */, targetTerminalId, writingPos)) { + AKLOGE("Cannot write bigram entry to set hasNext flag after GC. pos: %d", writingPos); + return false; + } + } return true; } |