diff options
| author | Narayan Kamath <narayan@google.com> | 2017-03-22 13:25:24 +0000 | 
|---|---|---|
| committer | Narayan Kamath <narayan@google.com> | 2017-04-26 14:36:26 +0000 | 
| commit | 9b64367193ffb252f869fb9f65a60b51a654119e (patch) | |
| tree | cd3e9e206f3cfe955b764de18d4164ffabc088dd | |
| parent | 058a73e7307a5c991d0a683f16725c550b3f0c1b (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.java | 22 | 
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();          }      } | 
