/* * 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; } };