diff options
author | Marco Nelissen <marcone@google.com> | 2014-08-28 10:49:08 -0700 |
---|---|---|
committer | Marco Nelissen <marcone@google.com> | 2014-08-28 11:25:34 -0700 |
commit | 047dd13ca42ff7cea10821ef64eb09229fa3e751 (patch) | |
tree | 5d6a6b01170dffe63e3ecd5be195a27d4dc525a0 /media/libstagefright/foundation/ALooperRoster.cpp | |
parent | 75c672fc376ef9b3ceff61a96513242b0e5ebd60 (diff) | |
download | frameworks_av-047dd13ca42ff7cea10821ef64eb09229fa3e751.zip frameworks_av-047dd13ca42ff7cea10821ef64eb09229fa3e751.tar.gz frameworks_av-047dd13ca42ff7cea10821ef64eb09229fa3e751.tar.bz2 |
Fix more potential deadlocks in ALooperRoster
Bug: 17059501
Change-Id: I242f2859527bed2d6e275c27de94fb19f4dcdc28
Diffstat (limited to 'media/libstagefright/foundation/ALooperRoster.cpp')
-rw-r--r-- | media/libstagefright/foundation/ALooperRoster.cpp | 41 |
1 files changed, 12 insertions, 29 deletions
diff --git a/media/libstagefright/foundation/ALooperRoster.cpp b/media/libstagefright/foundation/ALooperRoster.cpp index 0f44b52..e0dc768 100644 --- a/media/libstagefright/foundation/ALooperRoster.cpp +++ b/media/libstagefright/foundation/ALooperRoster.cpp @@ -99,35 +99,13 @@ void ALooperRoster::unregisterStaleHandlers() { status_t ALooperRoster::postMessage( const sp<AMessage> &msg, int64_t delayUs) { - Mutex::Autolock autoLock(mLock); - return postMessage_l(msg, delayUs); -} - -status_t ALooperRoster::postMessage_l( - const sp<AMessage> &msg, int64_t delayUs) { - ssize_t index = mHandlers.indexOfKey(msg->target()); - if (index < 0) { - ALOGW("failed to post message '%s'. Target handler not registered.", - msg->debugString().c_str()); - return -ENOENT; - } - - const HandlerInfo &info = mHandlers.valueAt(index); - - sp<ALooper> looper = info.mLooper.promote(); + sp<ALooper> looper = findLooper(msg->target()); if (looper == NULL) { - ALOGW("failed to post message. " - "Target handler %d still registered, but object gone.", - msg->target()); - - mHandlers.removeItemsAt(index); return -ENOENT; } - looper->post(msg, delayUs); - return OK; } @@ -181,18 +159,23 @@ sp<ALooper> ALooperRoster::findLooper(ALooper::handler_id handlerID) { status_t ALooperRoster::postAndAwaitResponse( const sp<AMessage> &msg, sp<AMessage> *response) { + sp<ALooper> looper = findLooper(msg->target()); + + if (looper == NULL) { + ALOGW("failed to post message. " + "Target handler %d still registered, but object gone.", + msg->target()); + response->clear(); + return -ENOENT; + } + Mutex::Autolock autoLock(mLock); uint32_t replyID = mNextReplyID++; msg->setInt32("replyID", replyID); - status_t err = postMessage_l(msg, 0 /* delayUs */); - - if (err != OK) { - response->clear(); - return err; - } + looper->post(msg, 0 /* delayUs */); ssize_t index; while ((index = mReplies.indexOfKey(replyID)) < 0) { |