am 5d58eb06: Merge "Fix a few memory leaks in the input dispatcher. (DO NOT MERGE)" into ics-mr1

* commit '5d58eb06bcc8671bae72fb2389a9929e106131cc':
  Fix a few memory leaks in the input dispatcher.  (DO NOT MERGE)
This commit is contained in:
Jeff Brown
2012-01-20 11:26:43 -08:00
committed by Android Git Automerger
2 changed files with 27 additions and 6 deletions

View File

@@ -1914,10 +1914,21 @@ void InputDispatcher::prepareDispatchCycleLocked(nsecs_t currentTime,
connection->getInputChannelName()); connection->getInputChannelName());
logOutboundMotionDetailsLocked(" ", splitMotionEntry); logOutboundMotionDetailsLocked(" ", splitMotionEntry);
#endif #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. // 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 // 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 // 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 DispatchEntry* dispatchEntry = new DispatchEntry(eventEntry, // increments ref
inputTargetFlags, inputTarget->xOffset, inputTarget->yOffset, inputTargetFlags, inputTarget->xOffset, inputTarget->yOffset,
inputTarget->scaleFactor); inputTarget->scaleFactor);
if (dispatchEntry->hasForegroundTarget()) {
incrementPendingForegroundDispatchesLocked(eventEntry);
}
// Handle the case where we could not stream a new motion sample because the consumer has // 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 // already consumed the motion event (otherwise the corresponding dispatch entry would
@@ -2085,6 +2093,7 @@ void InputDispatcher::enqueueDispatchEntryLocked(
ALOGD("channel '%s' ~ enqueueDispatchEntryLocked: skipping inconsistent key event", ALOGD("channel '%s' ~ enqueueDispatchEntryLocked: skipping inconsistent key event",
connection->getInputChannelName()); connection->getInputChannelName());
#endif #endif
delete dispatchEntry;
return; // skip the inconsistent event return; // skip the inconsistent event
} }
break; break;
@@ -2126,12 +2135,18 @@ void InputDispatcher::enqueueDispatchEntryLocked(
ALOGD("channel '%s' ~ enqueueDispatchEntryLocked: skipping inconsistent motion event", ALOGD("channel '%s' ~ enqueueDispatchEntryLocked: skipping inconsistent motion event",
connection->getInputChannelName()); connection->getInputChannelName());
#endif #endif
delete dispatchEntry;
return; // skip the inconsistent event return; // skip the inconsistent event
} }
break; break;
} }
} }
// Remember that we are waiting for this dispatch to complete.
if (dispatchEntry->hasForegroundTarget()) {
incrementPendingForegroundDispatchesLocked(eventEntry);
}
// Enqueue the dispatch entry. // Enqueue the dispatch entry.
connection->outboundQueue.enqueueAtTail(dispatchEntry); connection->outboundQueue.enqueueAtTail(dispatchEntry);
} }
@@ -2470,14 +2485,17 @@ void InputDispatcher::synthesizeCancelationEventsForInputChannelLocked(
void InputDispatcher::synthesizeCancelationEventsForConnectionLocked( void InputDispatcher::synthesizeCancelationEventsForConnectionLocked(
const sp<Connection>& connection, const CancelationOptions& options) { const sp<Connection>& connection, const CancelationOptions& options) {
if (connection->status == Connection::STATUS_BROKEN) {
return;
}
nsecs_t currentTime = now(); nsecs_t currentTime = now();
mTempCancelationEvents.clear(); mTempCancelationEvents.clear();
connection->inputState.synthesizeCancelationEvents(currentTime, connection->inputState.synthesizeCancelationEvents(currentTime,
mTempCancelationEvents, options); mTempCancelationEvents, options);
if (! mTempCancelationEvents.isEmpty() if (!mTempCancelationEvents.isEmpty()) {
&& connection->status != Connection::STATUS_BROKEN) {
#if DEBUG_OUTBOUND_EVENT_DETAILS #if DEBUG_OUTBOUND_EVENT_DETAILS
ALOGD("channel '%s' ~ Synthesized %d cancelation events to bring channel back in sync " ALOGD("channel '%s' ~ Synthesized %d cancelation events to bring channel back in sync "
"with reality: %s, mode=%d.", "with reality: %s, mode=%d.",

View File

@@ -1070,6 +1070,9 @@ private:
void prepareDispatchCycleLocked(nsecs_t currentTime, const sp<Connection>& connection, void prepareDispatchCycleLocked(nsecs_t currentTime, const sp<Connection>& connection,
EventEntry* eventEntry, const InputTarget* inputTarget, EventEntry* eventEntry, const InputTarget* inputTarget,
bool resumeWithAppendedMotionSample); bool resumeWithAppendedMotionSample);
void enqueueDispatchEntriesLocked(nsecs_t currentTime, const sp<Connection>& connection,
EventEntry* eventEntry, const InputTarget* inputTarget,
bool resumeWithAppendedMotionSample);
void enqueueDispatchEntryLocked(const sp<Connection>& connection, void enqueueDispatchEntryLocked(const sp<Connection>& connection,
EventEntry* eventEntry, const InputTarget* inputTarget, EventEntry* eventEntry, const InputTarget* inputTarget,
bool resumeWithAppendedMotionSample, int32_t dispatchMode); bool resumeWithAppendedMotionSample, int32_t dispatchMode);