Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@
/**
* Implements a static, compacted, binary dictionary of standard words.
*/
// TODO: All methods which should be locked need to have a suffix "Locked".
public final class BinaryDictionary extends Dictionary {
private static final String TAG = BinaryDictionary.class.getSimpleName();

Expand Down Expand Up @@ -88,13 +87,17 @@ public final class BinaryDictionary extends Dictionary {
// {@code mDicTraverseSessions}.
private DicTraverseSession getTraverseSession(final int traverseSessionId) {
synchronized(mDicTraverseSessions) {
DicTraverseSession traverseSession = mDicTraverseSessions.get(traverseSessionId);
if (traverseSession == null) {
traverseSession = new DicTraverseSession(mLocale, mNativeDict, mDictSize);
mDicTraverseSessions.put(traverseSessionId, traverseSession);
}
return traverseSession;
return getTraverseSessionLocked(traverseSessionId);
}
}

private DicTraverseSession getTraverseSessionLocked(final int traverseSessionId) {
DicTraverseSession traverseSession = mDicTraverseSessions.get(traverseSessionId);
if (traverseSession == null) {
traverseSession = new DicTraverseSession(mLocale, mNativeDict, mDictSize);
mDicTraverseSessions.put(traverseSessionId, traverseSession);
}
return traverseSession;
}

/**
Expand Down Expand Up @@ -624,19 +627,25 @@ public boolean shouldAutoCommit(final SuggestedWordInfo candidate) {
@Override
public void close() {
synchronized (mDicTraverseSessions) {
final int sessionsSize = mDicTraverseSessions.size();
for (int index = 0; index < sessionsSize; ++index) {
final DicTraverseSession traverseSession = mDicTraverseSessions.valueAt(index);
if (traverseSession != null) {
traverseSession.close();
}
closeDicTraverseSessionsLocked();
}
synchronized (this) {
closeInternalLocked();
}
}

private void closeDicTraverseSessionsLocked() {
final int sessionsSize = mDicTraverseSessions.size();
for (int index = 0; index < sessionsSize; ++index) {
final DicTraverseSession traverseSession = mDicTraverseSessions.valueAt(index);
if (traverseSession != null) {
traverseSession.close();
}
mDicTraverseSessions.clear();
}
closeInternalLocked();
mDicTraverseSessions.clear();
}

private synchronized void closeInternalLocked() {
private void closeInternalLocked() {
if (mNativeDict != 0) {
closeNative(mNativeDict);
mNativeDict = 0;
Expand All @@ -647,7 +656,9 @@ private synchronized void closeInternalLocked() {
@Override
protected void finalize() throws Throwable {
try {
closeInternalLocked();
synchronized (this) {
closeInternalLocked();
}
} finally {
super.finalize();
}
Expand Down
Loading