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