1b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/* 2b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Copyright (c) 2012, The Linux Foundation. All rights reserved. 3b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 4b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Redistribution and use in source and binary forms, with or without 5b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * modification, are permitted provided that the following conditions are 6b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * met: 7b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * * Redistributions of source code must retain the above copyright 8b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * notice, this list of conditions and the following disclaimer. 9b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * * Redistributions in binary form must reproduce the above 10b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * copyright notice, this list of conditions and the following 11b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * disclaimer in the documentation and/or other materials provided 12b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * with the distribution. 13b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * * Neither the name of The Linux Foundation nor the names of its 14b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * contributors may be used to endorse or promote products derived 15b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * from this software without specific prior written permission. 16b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * 17b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28b166940edca6e312463461438e2aa66e9852c26aBenoit Goby */ 29b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 30b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include "idle_invalidator.h" 31b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <unistd.h> 32b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 33b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#define II_DEBUG 0 34b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 35b166940edca6e312463461438e2aa66e9852c26aBenoit Gobystatic const char *threadName = "Invalidator"; 36b166940edca6e312463461438e2aa66e9852c26aBenoit GobyInvalidatorHandler IdleInvalidator::mHandler = NULL; 37b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyandroid::sp<IdleInvalidator> IdleInvalidator::sInstance(0); 38b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 39b166940edca6e312463461438e2aa66e9852c26aBenoit GobyIdleInvalidator::IdleInvalidator(): Thread(false), mHwcContext(0), 40b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mSleepAgain(false), mSleepTime(0) { 41b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGD_IF(II_DEBUG, "%s", __func__); 42b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 43b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 44b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyint IdleInvalidator::init(InvalidatorHandler reg_handler, void* user_data, 45b166940edca6e312463461438e2aa66e9852c26aBenoit Goby unsigned int idleSleepTime) { 46b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGD_IF(II_DEBUG, "%s", __func__); 47b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 48b166940edca6e312463461438e2aa66e9852c26aBenoit Goby /* store registered handler */ 49b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mHandler = reg_handler; 50b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mHwcContext = user_data; 51b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mSleepTime = idleSleepTime; //Time in millis 52b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return 0; 53b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 54b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 55b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool IdleInvalidator::threadLoop() { 56b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGD_IF(II_DEBUG, "%s", __func__); 57b166940edca6e312463461438e2aa66e9852c26aBenoit Goby usleep(mSleepTime * 500); 58b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(mSleepAgain) { 59b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //We need to sleep again! 60b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mSleepAgain = false; 61b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return true; 62b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 63b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 64b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mHandler((void*)mHwcContext); 65b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return false; 66b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 67b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 68b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyint IdleInvalidator::readyToRun() { 69b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGD_IF(II_DEBUG, "%s", __func__); 70b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return 0; /*NO_ERROR*/ 71b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 72b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 73b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid IdleInvalidator::onFirstRef() { 74b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGD_IF(II_DEBUG, "%s", __func__); 75b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 76b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 77b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyvoid IdleInvalidator::markForSleep() { 78b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mSleepAgain = true; 79b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //Triggers the threadLoop to run, if not already running. 80b166940edca6e312463461438e2aa66e9852c26aBenoit Goby run(threadName, android::PRIORITY_AUDIO); 81b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 82b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 83b166940edca6e312463461438e2aa66e9852c26aBenoit GobyIdleInvalidator *IdleInvalidator::getInstance() { 84b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGD_IF(II_DEBUG, "%s", __func__); 85b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(sInstance.get() == NULL) 86b166940edca6e312463461438e2aa66e9852c26aBenoit Goby sInstance = new IdleInvalidator(); 87b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return sInstance.get(); 88b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 89