ALooper.cpp revision b49c385232adfc7f82d7194c7b19b5966499f66b
172961230a5890071bcca436eb5630172ce84ec41Andreas Huber/* 272961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Copyright (C) 2010 The Android Open Source Project 372961230a5890071bcca436eb5630172ce84ec41Andreas Huber * 472961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 572961230a5890071bcca436eb5630172ce84ec41Andreas Huber * you may not use this file except in compliance with the License. 672961230a5890071bcca436eb5630172ce84ec41Andreas Huber * You may obtain a copy of the License at 772961230a5890071bcca436eb5630172ce84ec41Andreas Huber * 872961230a5890071bcca436eb5630172ce84ec41Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 972961230a5890071bcca436eb5630172ce84ec41Andreas Huber * 1072961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Unless required by applicable law or agreed to in writing, software 1172961230a5890071bcca436eb5630172ce84ec41Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1272961230a5890071bcca436eb5630172ce84ec41Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1372961230a5890071bcca436eb5630172ce84ec41Andreas Huber * See the License for the specific language governing permissions and 1472961230a5890071bcca436eb5630172ce84ec41Andreas Huber * limitations under the License. 1572961230a5890071bcca436eb5630172ce84ec41Andreas Huber */ 1672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1772961230a5890071bcca436eb5630172ce84ec41Andreas Huber//#define LOG_NDEBUG 0 1872961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define LOG_TAG "ALooper" 193f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar 203f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar#include <media/stagefright/foundation/ADebug.h> 213f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar 2272961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <utils/Log.h> 2372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2472961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <sys/time.h> 2572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2672961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "ALooper.h" 2772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2872961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AHandler.h" 2972961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "ALooperRoster.h" 3072961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AMessage.h" 3172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3272961230a5890071bcca436eb5630172ce84ec41Andreas Hubernamespace android { 3372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3472961230a5890071bcca436eb5630172ce84ec41Andreas HuberALooperRoster gLooperRoster; 3572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3672961230a5890071bcca436eb5630172ce84ec41Andreas Huberstruct ALooper::LooperThread : public Thread { 3742d7f83904b8a91ce33e87a44de109572679ac1fAndreas Huber LooperThread(ALooper *looper, bool canCallJava) 3842d7f83904b8a91ce33e87a44de109572679ac1fAndreas Huber : Thread(canCallJava), 39f8be8c0c8055ead961d23b969bf46315eb93e887Andreas Huber mLooper(looper), 40f8be8c0c8055ead961d23b969bf46315eb93e887Andreas Huber mThreadId(NULL) { 41f8be8c0c8055ead961d23b969bf46315eb93e887Andreas Huber } 42f8be8c0c8055ead961d23b969bf46315eb93e887Andreas Huber 43f8be8c0c8055ead961d23b969bf46315eb93e887Andreas Huber virtual status_t readyToRun() { 44f8be8c0c8055ead961d23b969bf46315eb93e887Andreas Huber mThreadId = androidGetThreadId(); 45f8be8c0c8055ead961d23b969bf46315eb93e887Andreas Huber 46f8be8c0c8055ead961d23b969bf46315eb93e887Andreas Huber return Thread::readyToRun(); 4772961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 4872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4972961230a5890071bcca436eb5630172ce84ec41Andreas Huber virtual bool threadLoop() { 5072961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mLooper->loop(); 5172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 5272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 53f8be8c0c8055ead961d23b969bf46315eb93e887Andreas Huber bool isCurrentThread() const { 54f8be8c0c8055ead961d23b969bf46315eb93e887Andreas Huber return mThreadId == androidGetThreadId(); 55f8be8c0c8055ead961d23b969bf46315eb93e887Andreas Huber } 56f8be8c0c8055ead961d23b969bf46315eb93e887Andreas Huber 5772961230a5890071bcca436eb5630172ce84ec41Andreas Huberprotected: 5872961230a5890071bcca436eb5630172ce84ec41Andreas Huber virtual ~LooperThread() {} 5972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 6072961230a5890071bcca436eb5630172ce84ec41Andreas Huberprivate: 6172961230a5890071bcca436eb5630172ce84ec41Andreas Huber ALooper *mLooper; 62f8be8c0c8055ead961d23b969bf46315eb93e887Andreas Huber android_thread_id_t mThreadId; 6372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(LooperThread); 6572961230a5890071bcca436eb5630172ce84ec41Andreas Huber}; 6672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 6772961230a5890071bcca436eb5630172ce84ec41Andreas Huber// static 6872961230a5890071bcca436eb5630172ce84ec41Andreas Huberint64_t ALooper::GetNowUs() { 69af5dd7753e62353411cf0daf3b513c38818e9662Andreas Huber return systemTime(SYSTEM_TIME_MONOTONIC) / 1000ll; 7072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 7172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 7272961230a5890071bcca436eb5630172ce84ec41Andreas HuberALooper::ALooper() 7372961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mRunningLocally(false) { 740b0f6075377260e006e860e3ba296f5504a6c891Marco Nelissen // clean up stale AHandlers. Doing it here instead of in the destructor avoids 750b0f6075377260e006e860e3ba296f5504a6c891Marco Nelissen // the side effect of objects being deleted from the unregister function recursively. 760b0f6075377260e006e860e3ba296f5504a6c891Marco Nelissen gLooperRoster.unregisterStaleHandlers(); 7772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 7872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 7972961230a5890071bcca436eb5630172ce84ec41Andreas HuberALooper::~ALooper() { 8072961230a5890071bcca436eb5630172ce84ec41Andreas Huber stop(); 810b0f6075377260e006e860e3ba296f5504a6c891Marco Nelissen // stale AHandlers are now cleaned up in the constructor of the next ALooper to come along 8272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 8372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 84a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Hubervoid ALooper::setName(const char *name) { 85a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber mName = name; 86a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber} 87a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber 8872961230a5890071bcca436eb5630172ce84ec41Andreas HuberALooper::handler_id ALooper::registerHandler(const sp<AHandler> &handler) { 8972961230a5890071bcca436eb5630172ce84ec41Andreas Huber return gLooperRoster.registerHandler(this, handler); 9072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 9172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9272961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid ALooper::unregisterHandler(handler_id handlerID) { 9372961230a5890071bcca436eb5630172ce84ec41Andreas Huber gLooperRoster.unregisterHandler(handlerID); 9472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 9572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 96348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huberstatus_t ALooper::start( 97348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber bool runOnCallingThread, bool canCallJava, int32_t priority) { 9872961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (runOnCallingThread) { 9972961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 10072961230a5890071bcca436eb5630172ce84ec41Andreas Huber Mutex::Autolock autoLock(mLock); 10172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10272961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (mThread != NULL || mRunningLocally) { 10372961230a5890071bcca436eb5630172ce84ec41Andreas Huber return INVALID_OPERATION; 10472961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 10572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10672961230a5890071bcca436eb5630172ce84ec41Andreas Huber mRunningLocally = true; 10772961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 10872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10972961230a5890071bcca436eb5630172ce84ec41Andreas Huber do { 11072961230a5890071bcca436eb5630172ce84ec41Andreas Huber } while (loop()); 11172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 11272961230a5890071bcca436eb5630172ce84ec41Andreas Huber return OK; 11372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 11472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 11572961230a5890071bcca436eb5630172ce84ec41Andreas Huber Mutex::Autolock autoLock(mLock); 11672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 11772961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (mThread != NULL || mRunningLocally) { 11872961230a5890071bcca436eb5630172ce84ec41Andreas Huber return INVALID_OPERATION; 11972961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 12072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 12142d7f83904b8a91ce33e87a44de109572679ac1fAndreas Huber mThread = new LooperThread(this, canCallJava); 12272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 123a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber status_t err = mThread->run( 124a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber mName.empty() ? "ALooper" : mName.c_str(), priority); 12572961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (err != OK) { 12672961230a5890071bcca436eb5630172ce84ec41Andreas Huber mThread.clear(); 12772961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 12872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 12972961230a5890071bcca436eb5630172ce84ec41Andreas Huber return err; 13072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 13172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 13272961230a5890071bcca436eb5630172ce84ec41Andreas Huberstatus_t ALooper::stop() { 13372961230a5890071bcca436eb5630172ce84ec41Andreas Huber sp<LooperThread> thread; 13472961230a5890071bcca436eb5630172ce84ec41Andreas Huber bool runningLocally; 13572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 13672961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 13772961230a5890071bcca436eb5630172ce84ec41Andreas Huber Mutex::Autolock autoLock(mLock); 13872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 13972961230a5890071bcca436eb5630172ce84ec41Andreas Huber thread = mThread; 14072961230a5890071bcca436eb5630172ce84ec41Andreas Huber runningLocally = mRunningLocally; 14172961230a5890071bcca436eb5630172ce84ec41Andreas Huber mThread.clear(); 14272961230a5890071bcca436eb5630172ce84ec41Andreas Huber mRunningLocally = false; 14372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 14472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 14572961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (thread == NULL && !runningLocally) { 14672961230a5890071bcca436eb5630172ce84ec41Andreas Huber return INVALID_OPERATION; 14772961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 14872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 14972961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (thread != NULL) { 15072961230a5890071bcca436eb5630172ce84ec41Andreas Huber thread->requestExit(); 15172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 15272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 15372961230a5890071bcca436eb5630172ce84ec41Andreas Huber mQueueChangedCondition.signal(); 1540abb2aa4859ced9165c77324cb83d1cd94f5f20cRonghua Wu { 1550abb2aa4859ced9165c77324cb83d1cd94f5f20cRonghua Wu Mutex::Autolock autoLock(mRepliesLock); 1560abb2aa4859ced9165c77324cb83d1cd94f5f20cRonghua Wu mRepliesCondition.broadcast(); 1570abb2aa4859ced9165c77324cb83d1cd94f5f20cRonghua Wu } 15872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 159f8be8c0c8055ead961d23b969bf46315eb93e887Andreas Huber if (!runningLocally && !thread->isCurrentThread()) { 160f8be8c0c8055ead961d23b969bf46315eb93e887Andreas Huber // If not running locally and this thread _is_ the looper thread, 161f8be8c0c8055ead961d23b969bf46315eb93e887Andreas Huber // the loop() function will return and never be called again. 16272961230a5890071bcca436eb5630172ce84ec41Andreas Huber thread->requestExitAndWait(); 16372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 16472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 16572961230a5890071bcca436eb5630172ce84ec41Andreas Huber return OK; 16672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 16772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 16872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid ALooper::post(const sp<AMessage> &msg, int64_t delayUs) { 16972961230a5890071bcca436eb5630172ce84ec41Andreas Huber Mutex::Autolock autoLock(mLock); 17072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 17172961230a5890071bcca436eb5630172ce84ec41Andreas Huber int64_t whenUs; 17272961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (delayUs > 0) { 17372961230a5890071bcca436eb5630172ce84ec41Andreas Huber whenUs = GetNowUs() + delayUs; 17472961230a5890071bcca436eb5630172ce84ec41Andreas Huber } else { 17572961230a5890071bcca436eb5630172ce84ec41Andreas Huber whenUs = GetNowUs(); 17672961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 17772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 17872961230a5890071bcca436eb5630172ce84ec41Andreas Huber List<Event>::iterator it = mEventQueue.begin(); 17972961230a5890071bcca436eb5630172ce84ec41Andreas Huber while (it != mEventQueue.end() && (*it).mWhenUs <= whenUs) { 18072961230a5890071bcca436eb5630172ce84ec41Andreas Huber ++it; 18172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 18272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 18372961230a5890071bcca436eb5630172ce84ec41Andreas Huber Event event; 18472961230a5890071bcca436eb5630172ce84ec41Andreas Huber event.mWhenUs = whenUs; 18572961230a5890071bcca436eb5630172ce84ec41Andreas Huber event.mMessage = msg; 18672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 18772961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (it == mEventQueue.begin()) { 18872961230a5890071bcca436eb5630172ce84ec41Andreas Huber mQueueChangedCondition.signal(); 18972961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 19072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 19172961230a5890071bcca436eb5630172ce84ec41Andreas Huber mEventQueue.insert(it, event); 19272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 19372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 19472961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool ALooper::loop() { 19572961230a5890071bcca436eb5630172ce84ec41Andreas Huber Event event; 19672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 19772961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 19872961230a5890071bcca436eb5630172ce84ec41Andreas Huber Mutex::Autolock autoLock(mLock); 19972961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (mThread == NULL && !mRunningLocally) { 20072961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; 20172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 20272961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (mEventQueue.empty()) { 20372961230a5890071bcca436eb5630172ce84ec41Andreas Huber mQueueChangedCondition.wait(mLock); 20472961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; 20572961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 20672961230a5890071bcca436eb5630172ce84ec41Andreas Huber int64_t whenUs = (*mEventQueue.begin()).mWhenUs; 20772961230a5890071bcca436eb5630172ce84ec41Andreas Huber int64_t nowUs = GetNowUs(); 20872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 20972961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (whenUs > nowUs) { 21072961230a5890071bcca436eb5630172ce84ec41Andreas Huber int64_t delayUs = whenUs - nowUs; 21172961230a5890071bcca436eb5630172ce84ec41Andreas Huber mQueueChangedCondition.waitRelative(mLock, delayUs * 1000ll); 21272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 21372961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; 21472961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 21572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 21672961230a5890071bcca436eb5630172ce84ec41Andreas Huber event = *mEventQueue.begin(); 21772961230a5890071bcca436eb5630172ce84ec41Andreas Huber mEventQueue.erase(mEventQueue.begin()); 21872961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 21972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2205804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar event.mMessage->deliver(); 22172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 222f8be8c0c8055ead961d23b969bf46315eb93e887Andreas Huber // NOTE: It's important to note that at this point our "ALooper" object 223f8be8c0c8055ead961d23b969bf46315eb93e887Andreas Huber // may no longer exist (its final reference may have gone away while 224f8be8c0c8055ead961d23b969bf46315eb93e887Andreas Huber // delivering the message). We have made sure, however, that loop() 225f8be8c0c8055ead961d23b969bf46315eb93e887Andreas Huber // won't be called again. 226f8be8c0c8055ead961d23b969bf46315eb93e887Andreas Huber 22772961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; 22872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 22972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2303f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar// to be called by AMessage::postAndAwaitResponse only 2313f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarsp<AReplyToken> ALooper::createReplyToken() { 2323f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar return new AReplyToken(this); 2333f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar} 2343f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar 2353f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar// to be called by AMessage::postAndAwaitResponse only 2363f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstatus_t ALooper::awaitResponse(const sp<AReplyToken> &replyToken, sp<AMessage> *response) { 2373f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar // return status in case we want to handle an interrupted wait 2383f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar Mutex::Autolock autoLock(mRepliesLock); 2393f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar CHECK(replyToken != NULL); 240b49c385232adfc7f82d7194c7b19b5966499f66bRonghua Wu while (!replyToken->retrieveReply(response)) { 2410abb2aa4859ced9165c77324cb83d1cd94f5f20cRonghua Wu { 2420abb2aa4859ced9165c77324cb83d1cd94f5f20cRonghua Wu Mutex::Autolock autoLock(mLock); 2430abb2aa4859ced9165c77324cb83d1cd94f5f20cRonghua Wu if (mThread == NULL) { 244b49c385232adfc7f82d7194c7b19b5966499f66bRonghua Wu return -ENOENT; 2450abb2aa4859ced9165c77324cb83d1cd94f5f20cRonghua Wu } 2460abb2aa4859ced9165c77324cb83d1cd94f5f20cRonghua Wu } 247b49c385232adfc7f82d7194c7b19b5966499f66bRonghua Wu mRepliesCondition.wait(mRepliesLock); 2483f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar } 249b49c385232adfc7f82d7194c7b19b5966499f66bRonghua Wu return OK; 2503f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar} 2513f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar 2523f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstatus_t ALooper::postReply(const sp<AReplyToken> &replyToken, const sp<AMessage> &reply) { 2533f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar Mutex::Autolock autoLock(mRepliesLock); 2543f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar status_t err = replyToken->setReply(reply); 2553f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar if (err == OK) { 2563f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar mRepliesCondition.broadcast(); 2573f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar } 2583f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar return err; 2593f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar} 2603f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar 26172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} // namespace android 262