From d28f4be870ea8850a2d4a2fe51333643f16b9ab1 Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Wed, 2 Jun 2010 15:35:46 -0700 Subject: [PATCH] Fixed some minor bugs in MotionEvent recycling. 1. MotionEvent.recycle() never set mRecycled to true so it couldn't actually detect doubly-recycled events (unless the TRACK_RECYCLED_LOCATION debuging flag was enabled). 2. MotionEvent.obtain() did not set mNext to null before returning the event so it would unnecessarily retain a reference to other events in the recycled event linked list until recycled again. Change-Id: I93709c402d260691875f632dfc080a355f85fbb0 --- core/java/android/view/MotionEvent.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java index d648e96693c78..eefbf7a1a3b3f 100644 --- a/core/java/android/view/MotionEvent.java +++ b/core/java/android/view/MotionEvent.java @@ -255,17 +255,19 @@ public final class MotionEvent implements Parcelable { } static private MotionEvent obtain() { + final MotionEvent ev; synchronized (gRecyclerLock) { if (gRecyclerTop == null) { return new MotionEvent(); } - MotionEvent ev = gRecyclerTop; + ev = gRecyclerTop; gRecyclerTop = ev.mNext; gRecyclerUsed--; - ev.mRecycledLocation = null; - ev.mRecycled = false; - return ev; } + ev.mRecycledLocation = null; + ev.mRecycled = false; + ev.mNext = null; + return ev; } /** @@ -620,11 +622,14 @@ public final class MotionEvent implements Parcelable { throw new RuntimeException(toString() + " recycled twice!", mRecycledLocation); } mRecycledLocation = new RuntimeException("Last recycled here"); - } else if (mRecycled) { - throw new RuntimeException(toString() + " recycled twice!"); + //Log.w("MotionEvent", "Recycling event " + this, mRecycledLocation); + } else { + if (mRecycled) { + throw new RuntimeException(toString() + " recycled twice!"); + } + mRecycled = true; } - //Log.w("MotionEvent", "Recycling event " + this, mRecycledLocation); synchronized (gRecyclerLock) { if (gRecyclerUsed < MAX_RECYCLED) { gRecyclerUsed++;