summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNarayan Kamath <narayan@google.com>2017-03-22 13:25:24 +0000
committerNarayan Kamath <narayan@google.com>2017-04-26 14:36:26 +0000
commit9b64367193ffb252f869fb9f65a60b51a654119e (patch)
treecd3e9e206f3cfe955b764de18d4164ffabc088dd
parent058a73e7307a5c991d0a683f16725c550b3f0c1b (diff)
SpellCheckerSession: Fix brittle finalizer pattern.
Always call super.finalize, also make sure super-class finalizers are called last (i.e in reverse order of construction). While we're here, we can switch to dalvik.system.CloseGuard to warn if the object hasn't been properly closed. Test: make Bug: 35609098 Change-Id: I4e00c3a2cec93d1dacff20546e481fe757279661
-rw-r--r--core/java/android/view/textservice/SpellCheckerSession.java22
1 files changed, 14 insertions, 8 deletions
diff --git a/core/java/android/view/textservice/SpellCheckerSession.java b/core/java/android/view/textservice/SpellCheckerSession.java
index 2e2056cbabef..779eefb14c74 100644
--- a/core/java/android/view/textservice/SpellCheckerSession.java
+++ b/core/java/android/view/textservice/SpellCheckerSession.java
@@ -29,6 +29,8 @@ import com.android.internal.textservice.ISpellCheckerSessionListener;
import com.android.internal.textservice.ITextServicesManager;
import com.android.internal.textservice.ITextServicesSessionListener;
+import dalvik.system.CloseGuard;
+
import java.util.LinkedList;
import java.util.Queue;
@@ -98,7 +100,7 @@ public class SpellCheckerSession {
private final SpellCheckerSessionListener mSpellCheckerSessionListener;
private final SpellCheckerSessionListenerImpl mSpellCheckerSessionListenerImpl;
- private boolean mIsUsed;
+ private final CloseGuard mGuard = CloseGuard.get();
/** Handler that will execute the main tasks */
private final Handler mHandler = new Handler() {
@@ -128,8 +130,9 @@ public class SpellCheckerSession {
mSpellCheckerSessionListenerImpl = new SpellCheckerSessionListenerImpl(mHandler);
mInternalListener = new InternalListener(mSpellCheckerSessionListenerImpl);
mTextServicesManager = tsm;
- mIsUsed = true;
mSpellCheckerSessionListener = listener;
+
+ mGuard.open("finishSession");
}
/**
@@ -160,7 +163,7 @@ public class SpellCheckerSession {
* checker.
*/
public void close() {
- mIsUsed = false;
+ mGuard.close();
try {
mSpellCheckerSessionListenerImpl.close();
mTextServicesManager.finishSpellCheckerService(mSpellCheckerSessionListenerImpl);
@@ -542,11 +545,14 @@ public class SpellCheckerSession {
@Override
protected void finalize() throws Throwable {
- super.finalize();
- if (mIsUsed) {
- Log.e(TAG, "SpellCheckerSession was not finished properly." +
- "You should call finishSession() when you finished to use a spell checker.");
- close();
+ try {
+ // Note that mGuard will be null if the constructor threw.
+ if (mGuard != null) {
+ mGuard.warnIfOpen();
+ close();
+ }
+ } finally {
+ super.finalize();
}
}