summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-07-07 09:45:38 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2010-07-07 09:45:38 -0700
commitc832baa107f36740e462c83e7525ba2e9f01f086 (patch)
tree8e8c374be87da68ed6bc0c623770adc5bf0e8dec
parenta87843704107d6da82fa64bcab2635a2cacad8b4 (diff)
parentf5b4e342b581a6e219b49141861b353fb139d00b (diff)
downloadframeworks_base-c832baa107f36740e462c83e7525ba2e9f01f086.zip
frameworks_base-c832baa107f36740e462c83e7525ba2e9f01f086.tar.gz
frameworks_base-c832baa107f36740e462c83e7525ba2e9f01f086.tar.bz2
am f5b4e342: am 2e6aff8e: Merge "ALooperRoster no longer holds strong references to handlers and loopers." into gingerbread
Merge commit 'f5b4e342b581a6e219b49141861b353fb139d00b' * commit 'f5b4e342b581a6e219b49141861b353fb139d00b': ALooperRoster no longer holds strong references to handlers and loopers.
-rw-r--r--include/media/stagefright/foundation/ALooperRoster.h4
-rw-r--r--media/libstagefright/foundation/ALooperRoster.cpp44
2 files changed, 40 insertions, 8 deletions
diff --git a/include/media/stagefright/foundation/ALooperRoster.h b/include/media/stagefright/foundation/ALooperRoster.h
index 8f6316e..c1bd4ed 100644
--- a/include/media/stagefright/foundation/ALooperRoster.h
+++ b/include/media/stagefright/foundation/ALooperRoster.h
@@ -38,8 +38,8 @@ struct ALooperRoster {
private:
struct HandlerInfo {
- sp<ALooper> mLooper;
- sp<AHandler> mHandler;
+ wp<ALooper> mLooper;
+ wp<AHandler> mHandler;
};
Mutex mLock;
diff --git a/media/libstagefright/foundation/ALooperRoster.cpp b/media/libstagefright/foundation/ALooperRoster.cpp
index bb9bc14..65f7593 100644
--- a/media/libstagefright/foundation/ALooperRoster.cpp
+++ b/media/libstagefright/foundation/ALooperRoster.cpp
@@ -54,10 +54,15 @@ void ALooperRoster::unregisterHandler(ALooper::handler_id handlerID) {
Mutex::Autolock autoLock(mLock);
ssize_t index = mHandlers.indexOfKey(handlerID);
- CHECK(index >= 0);
+ CHECK_GE(index, 0);
const HandlerInfo &info = mHandlers.valueAt(index);
- info.mHandler->setID(0);
+
+ sp<AHandler> handler = info.mHandler.promote();
+
+ if (handler != NULL) {
+ handler->setID(0);
+ }
mHandlers.removeItemsAt(index);
}
@@ -74,7 +79,18 @@ void ALooperRoster::postMessage(
}
const HandlerInfo &info = mHandlers.valueAt(index);
- info.mLooper->post(msg, delayUs);
+
+ sp<ALooper> looper = info.mLooper.promote();
+
+ if (looper == NULL) {
+ LOG(WARNING) << "failed to post message. "
+ "Target handler still registered, but object gone.";
+
+ mHandlers.removeItemsAt(index);
+ return;
+ }
+
+ looper->post(msg, delayUs);
}
void ALooperRoster::deliverMessage(const sp<AMessage> &msg) {
@@ -86,12 +102,21 @@ void ALooperRoster::deliverMessage(const sp<AMessage> &msg) {
ssize_t index = mHandlers.indexOfKey(msg->target());
if (index < 0) {
- LOG(WARNING) << "failed to deliver message. Target handler not registered.";
+ LOG(WARNING) << "failed to deliver message. "
+ << "Target handler not registered.";
return;
}
const HandlerInfo &info = mHandlers.valueAt(index);
- handler = info.mHandler;
+ handler = info.mHandler.promote();
+
+ if (handler == NULL) {
+ LOG(WARNING) << "failed to deliver message. "
+ "Target handler registered, but object gone.";
+
+ mHandlers.removeItemsAt(index);
+ return;
+ }
}
handler->onMessageReceived(msg);
@@ -106,7 +131,14 @@ sp<ALooper> ALooperRoster::findLooper(ALooper::handler_id handlerID) {
return NULL;
}
- return mHandlers.valueAt(index).mLooper;
+ sp<ALooper> looper = mHandlers.valueAt(index).mLooper.promote();
+
+ if (looper == NULL) {
+ mHandlers.removeItemsAt(index);
+ return NULL;
+ }
+
+ return looper;
}
} // namespace android