From c160373b6a8e8a536ad8aa2798a33a41d3050f3b Mon Sep 17 00:00:00 2001 From: Jean Chalard Date: Tue, 16 Aug 2011 19:43:16 +0900 Subject: [PATCH] Close dictionary pools when they are not used any more. Bug: 5156851 Change-Id: Icaba54734eb790b40dc2012aac25df5b2af71dbb --- .../AndroidSpellCheckerService.java | 17 +++++++++++-- .../latin/spellcheck/DictionaryPool.java | 25 ++++++++++++++++++- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java index c71841042..649774d78 100644 --- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java @@ -16,6 +16,7 @@ package com.android.inputmethod.latin.spellcheck; +import android.content.Intent; import android.content.res.Resources; import android.service.textservice.SpellCheckerService; import android.service.textservice.SpellCheckerService.Session; @@ -48,7 +49,7 @@ public class AndroidSpellCheckerService extends SpellCheckerService { private static final int POOL_SIZE = 2; private final static String[] emptyArray = new String[0]; - private final Map mDictionaryPools = + private Map mDictionaryPools = Collections.synchronizedMap(new TreeMap()); @Override @@ -104,6 +105,16 @@ public class AndroidSpellCheckerService extends SpellCheckerService { } } + @Override + public boolean onUnbind(final Intent intent) { + final Map oldPools = mDictionaryPools; + mDictionaryPools = Collections.synchronizedMap(new TreeMap()); + for (DictionaryPool pool : oldPools.values()) { + pool.close(); + } + return false; + } + private DictionaryPool getDictionaryPool(final String locale) { DictionaryPool pool = mDictionaryPools.get(locale); if (null == pool) { @@ -167,7 +178,9 @@ public class AndroidSpellCheckerService extends SpellCheckerService { dictInfo.mDictionary.getWords(composer, suggestionsGatherer, dictInfo.mProximityInfo); isInDict = dictInfo.mDictionary.isValidWord(text); - mDictionaryPool.offer(dictInfo); + if (!mDictionaryPool.offer(dictInfo)) { + Log.e(TAG, "Can't re-insert a dictionary into its pool"); + } } catch (InterruptedException e) { // I don't think this can happen. return new SuggestionsInfo(0, new String[0]); diff --git a/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java b/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java index dfbfcc7f6..ee294f6b0 100644 --- a/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java +++ b/java/src/com/android/inputmethod/latin/spellcheck/DictionaryPool.java @@ -28,7 +28,8 @@ public class DictionaryPool extends LinkedBlockingQueue { private final AndroidSpellCheckerService mService; private final int mMaxSize; private final Locale mLocale; - private int mSize = 0; + private int mSize; + private volatile boolean mClosed; public DictionaryPool(final int maxSize, final AndroidSpellCheckerService service, final Locale locale) { @@ -36,6 +37,8 @@ public class DictionaryPool extends LinkedBlockingQueue { mMaxSize = maxSize; mService = service; mLocale = locale; + mSize = 0; + mClosed = false; } @Override @@ -52,4 +55,24 @@ public class DictionaryPool extends LinkedBlockingQueue { } } } + + public void close() { + synchronized(this) { + mClosed = true; + for (DictAndProximity dict : this) { + dict.mDictionary.close(); + } + clear(); + } + } + + @Override + public boolean offer(final DictAndProximity dict) { + if (mClosed) { + dict.mDictionary.close(); + return false; + } else { + return super.offer(dict); + } + } }