/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "HandlerThread.h"

namespace android {

HandlerThread::HandlerThread()
    : mShouldQuit(false) {

}

HandlerThread::~HandlerThread() {
    quit();
}

sp<Looper> HandlerThread::getLooper() {
    Mutex::Autolock autoLock(mLock);
    if (mLooper.get() == 0) {
        mLooperWait.wait(mLock);
    }
    return mLooper;
}

status_t HandlerThread::start(const char* name, int32_t priority, size_t stack) {
    return run(name, priority, stack);
}

void HandlerThread::quit() {
    if (!isRunning()) {
        return;
    }
    sp<Looper> looper = getLooper();
    mLock.lock();
    mShouldQuit = true;
    mLock.unlock();
    looper->wake();
    requestExitAndWait();
}

bool HandlerThread::threadLoop() {
    mLock.lock();
    mLooper = Looper::prepare(0);
    mLooperWait.broadcast();
    mLock.unlock();
    while (true) {
        do {
            Mutex::Autolock autoLock(mLock);
            if (mShouldQuit) {
                return false;
            }
        } while (false);
        mLooper->pollOnce(-1);
    }
    return false;
}


};
