diff options
| author | 2016-10-03 16:24:26 -0700 | |
|---|---|---|
| committer | 2016-10-04 12:57:38 -0700 | |
| commit | 3b8e6b2f30af0564538c2a660033d6a97ab8038f (patch) | |
| tree | 24513f55fef74732248dd0402e9ff03658658fd4 /libs/gui/BufferQueueProducer.cpp | |
| parent | 3169437feb387b56499208464960d281bd9b87c9 (diff) | |
Eliminate unnecessary calls to onBufferReleased
This change adds a callback to ProducerListener to indicate whether the
listener needs the 'onBufferReleased' notification. This allows us to
avoid making that binder call unnecessarily, saving ~170us per frame on
Android Wear.
By default the new callback returns true, so behavior for existing
clients should be unchanged. Only the DummyProducerListener returns
false.
Also note that it would be simpler to just pass NULL for the
ProducerListener if not for that fact that we still need it for death
notification.
Bug: b/31122630
Change-Id: I730834218a055d89e89f876dd77da8127eb78000
Diffstat (limited to 'libs/gui/BufferQueueProducer.cpp')
| -rw-r--r-- | libs/gui/BufferQueueProducer.cpp | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/libs/gui/BufferQueueProducer.cpp b/libs/gui/BufferQueueProducer.cpp index 48b1db8f59..7020214238 100644 --- a/libs/gui/BufferQueueProducer.cpp +++ b/libs/gui/BufferQueueProducer.cpp @@ -1113,18 +1113,22 @@ status_t BufferQueueProducer::connect(const sp<IProducerListener>& listener, static_cast<uint32_t>(mCore->mQueue.size()), mCore->mFrameCounter + 1); - // Set up a death notification so that we can disconnect - // automatically if the remote producer dies - if (listener != NULL && - IInterface::asBinder(listener)->remoteBinder() != NULL) { - status = IInterface::asBinder(listener)->linkToDeath( - static_cast<IBinder::DeathRecipient*>(this)); - if (status != NO_ERROR) { - BQ_LOGE("connect: linkToDeath failed: %s (%d)", - strerror(-status), status); + if (listener != NULL) { + // Set up a death notification so that we can disconnect + // automatically if the remote producer dies + if (IInterface::asBinder(listener)->remoteBinder() != NULL) { + status = IInterface::asBinder(listener)->linkToDeath( + static_cast<IBinder::DeathRecipient*>(this)); + if (status != NO_ERROR) { + BQ_LOGE("connect: linkToDeath failed: %s (%d)", + strerror(-status), status); + } + mCore->mLinkedToDeath = listener; + } + if (listener->needsReleaseNotify()) { + mCore->mConnectedProducerListener = listener; } } - mCore->mConnectedProducerListener = listener; break; default: BQ_LOGE("connect: unknown API %d", api); @@ -1186,9 +1190,9 @@ status_t BufferQueueProducer::disconnect(int api, DisconnectMode mode) { mCore->freeAllBuffersLocked(); // Remove our death notification callback if we have one - if (mCore->mConnectedProducerListener != NULL) { + if (mCore->mLinkedToDeath != NULL) { sp<IBinder> token = - IInterface::asBinder(mCore->mConnectedProducerListener); + IInterface::asBinder(mCore->mLinkedToDeath); // This can fail if we're here because of the death // notification, but we just ignore it token->unlinkToDeath( @@ -1196,6 +1200,7 @@ status_t BufferQueueProducer::disconnect(int api, DisconnectMode mode) { } mCore->mSharedBufferSlot = BufferQueueCore::INVALID_BUFFER_SLOT; + mCore->mLinkedToDeath = NULL; mCore->mConnectedProducerListener = NULL; mCore->mConnectedApi = BufferQueueCore::NO_CONNECTED_API; mCore->mConnectedPid = -1; |