diff options
author | Jeff Brown <jeffbrown@google.com> | 2012-01-20 11:24:01 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-01-20 11:24:01 -0800 |
commit | 5d58eb06bcc8671bae72fb2389a9929e106131cc (patch) | |
tree | a071eaa43a1b9156ce7de30e5aff51a1cb0a947e /services | |
parent | 820b45c0a21980a43532b9fb9823f8aa08c64a15 (diff) | |
parent | 9f63f121bdc0db64f9dd2be9db792a8698bb0d67 (diff) | |
download | frameworks_base-5d58eb06bcc8671bae72fb2389a9929e106131cc.zip frameworks_base-5d58eb06bcc8671bae72fb2389a9929e106131cc.tar.gz frameworks_base-5d58eb06bcc8671bae72fb2389a9929e106131cc.tar.bz2 |
Merge "Fix a few memory leaks in the input dispatcher. (DO NOT MERGE)" into ics-mr1
Diffstat (limited to 'services')
-rw-r--r-- | services/input/InputDispatcher.cpp | 30 | ||||
-rw-r--r-- | services/input/InputDispatcher.h | 3 |
2 files changed, 27 insertions, 6 deletions
diff --git a/services/input/InputDispatcher.cpp b/services/input/InputDispatcher.cpp index 40268b0..7303392 100644 --- a/services/input/InputDispatcher.cpp +++ b/services/input/InputDispatcher.cpp @@ -1914,10 +1914,21 @@ void InputDispatcher::prepareDispatchCycleLocked(nsecs_t currentTime, connection->getInputChannelName()); logOutboundMotionDetailsLocked(" ", splitMotionEntry); #endif - eventEntry = splitMotionEntry; + enqueueDispatchEntriesLocked(currentTime, connection, + splitMotionEntry, inputTarget, resumeWithAppendedMotionSample); + splitMotionEntry->release(); + return; } } + // Not splitting. Enqueue dispatch entries for the event as is. + enqueueDispatchEntriesLocked(currentTime, connection, eventEntry, inputTarget, + resumeWithAppendedMotionSample); +} + +void InputDispatcher::enqueueDispatchEntriesLocked(nsecs_t currentTime, + const sp<Connection>& connection, EventEntry* eventEntry, const InputTarget* inputTarget, + bool resumeWithAppendedMotionSample) { // Resume the dispatch cycle with a freshly appended motion sample. // First we check that the last dispatch entry in the outbound queue is for the same // motion event to which we appended the motion sample. If we find such a dispatch @@ -2054,9 +2065,6 @@ void InputDispatcher::enqueueDispatchEntryLocked( DispatchEntry* dispatchEntry = new DispatchEntry(eventEntry, // increments ref inputTargetFlags, inputTarget->xOffset, inputTarget->yOffset, inputTarget->scaleFactor); - if (dispatchEntry->hasForegroundTarget()) { - incrementPendingForegroundDispatchesLocked(eventEntry); - } // Handle the case where we could not stream a new motion sample because the consumer has // already consumed the motion event (otherwise the corresponding dispatch entry would @@ -2085,6 +2093,7 @@ void InputDispatcher::enqueueDispatchEntryLocked( LOGD("channel '%s' ~ enqueueDispatchEntryLocked: skipping inconsistent key event", connection->getInputChannelName()); #endif + delete dispatchEntry; return; // skip the inconsistent event } break; @@ -2126,12 +2135,18 @@ void InputDispatcher::enqueueDispatchEntryLocked( LOGD("channel '%s' ~ enqueueDispatchEntryLocked: skipping inconsistent motion event", connection->getInputChannelName()); #endif + delete dispatchEntry; return; // skip the inconsistent event } break; } } + // Remember that we are waiting for this dispatch to complete. + if (dispatchEntry->hasForegroundTarget()) { + incrementPendingForegroundDispatchesLocked(eventEntry); + } + // Enqueue the dispatch entry. connection->outboundQueue.enqueueAtTail(dispatchEntry); } @@ -2470,14 +2485,17 @@ void InputDispatcher::synthesizeCancelationEventsForInputChannelLocked( void InputDispatcher::synthesizeCancelationEventsForConnectionLocked( const sp<Connection>& connection, const CancelationOptions& options) { + if (connection->status == Connection::STATUS_BROKEN) { + return; + } + nsecs_t currentTime = now(); mTempCancelationEvents.clear(); connection->inputState.synthesizeCancelationEvents(currentTime, mTempCancelationEvents, options); - if (! mTempCancelationEvents.isEmpty() - && connection->status != Connection::STATUS_BROKEN) { + if (!mTempCancelationEvents.isEmpty()) { #if DEBUG_OUTBOUND_EVENT_DETAILS LOGD("channel '%s' ~ Synthesized %d cancelation events to bring channel back in sync " "with reality: %s, mode=%d.", diff --git a/services/input/InputDispatcher.h b/services/input/InputDispatcher.h index 8ae5a56..1478d67 100644 --- a/services/input/InputDispatcher.h +++ b/services/input/InputDispatcher.h @@ -1070,6 +1070,9 @@ private: void prepareDispatchCycleLocked(nsecs_t currentTime, const sp<Connection>& connection, EventEntry* eventEntry, const InputTarget* inputTarget, bool resumeWithAppendedMotionSample); + void enqueueDispatchEntriesLocked(nsecs_t currentTime, const sp<Connection>& connection, + EventEntry* eventEntry, const InputTarget* inputTarget, + bool resumeWithAppendedMotionSample); void enqueueDispatchEntryLocked(const sp<Connection>& connection, EventEntry* eventEntry, const InputTarget* inputTarget, bool resumeWithAppendedMotionSample, int32_t dispatchMode); |