Omx: Fix codec instance leak if Observer dies
If Observer dies, {instance, observer} book-keeping may be
cleaned up. In such case avoid only unlinking the death-notifier,
but proceed with instance cleanup
Test: Manual use of Camera, Photos, Play Movies and YouTube.
Test: Small CtsMediaTestCases
Bug: 38149818
Change-Id: I412953b55827c93730353a95560b865fb18b5f0f
diff --git a/media/libstagefright/omx/1.0/Omx.cpp b/media/libstagefright/omx/1.0/Omx.cpp
index 365ea5d..64b2c08 100644
--- a/media/libstagefright/omx/1.0/Omx.cpp
+++ b/media/libstagefright/omx/1.0/Omx.cpp
@@ -180,26 +180,22 @@
return OK;
}
- wp<IBase> observer;
{
Mutex::Autolock autoLock(mLock);
ssize_t observerIndex = mNode2Observer.indexOfKey(instance.get());
- if (observerIndex < 0) {
- return OK;
- }
- observer = mNode2Observer.valueAt(observerIndex);
- ssize_t nodeIndex = mLiveNodes.indexOfKey(observer);
- if (nodeIndex < 0) {
- return OK;
- }
- mNode2Observer.removeItemsAt(observerIndex);
- mLiveNodes.removeItemsAt(nodeIndex);
- }
-
- {
- sp<IBase> sObserver = observer.promote();
- if (sObserver != nullptr) {
- sObserver->unlinkToDeath(this);
+ if (observerIndex >= 0) {
+ wp<IBase> observer = mNode2Observer.valueAt(observerIndex);
+ ssize_t nodeIndex = mLiveNodes.indexOfKey(observer);
+ if (nodeIndex >= 0) {
+ mNode2Observer.removeItemsAt(observerIndex);
+ mLiveNodes.removeItemsAt(nodeIndex);
+ sp<IBase> sObserver = observer.promote();
+ if (sObserver != nullptr) {
+ sObserver->unlinkToDeath(this);
+ }
+ } else {
+ LOG(WARNING) << "Inconsistent observer record";
+ }
}
}