Omx: Fix codec instance leak if Observer dies am: 990bc6dec9
am: 0140b054b0
Change-Id: Ibcc916d72d516dad391c89c8597225a54e622856
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";
+ }
}
}