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
This commit is contained in:
Jeff Brown
2010-06-02 15:35:46 -07:00
parent 501b2b400a
commit d28f4be870

View File

@@ -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++;