SignalDrivenThread.cpp revision 2c872806d9418b42ac1e99ea24be190d1970da98
1c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin/* 2c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** 3c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** Copyright 2008, The Android Open Source Project 4c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** Copyright 2012, Samsung Electronics Co. LTD 5c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** 6c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** Licensed under the Apache License, Version 2.0 (the "License"); 7c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** you may not use this file except in compliance with the License. 8c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** You may obtain a copy of the License at 9c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** 10c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** http://www.apache.org/licenses/LICENSE-2.0 11c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** 12c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** Unless required by applicable law or agreed to in writing, software 13c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** distributed under the License is distributed on an "AS IS" BASIS, 14c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** See the License for the specific language governing permissions and 16c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin** limitations under the License. 17c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin*/ 18c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 19c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin/*! 20c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin * \file SignalDrivenThread.cpp 21c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin * \brief source file for general thread ( for camera hal2 implementation ) 22c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin * \author Sungjoong Kang(sj3.kang@samsung.com) 23c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin * \date 2012/05/31 24c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin * 25c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin * <b>Revision History: </b> 26c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin * - 2012/05/31 : Sungjoong Kang(sj3.kang@samsung.com) \n 27c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin * Initial Release 2813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang * 2913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang * - 2012/07/10 : Sungjoong Kang(sj3.kang@samsung.com) \n 3013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang * 2nd Release 3113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang * 32c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin */ 3313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang 349dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang//#define LOG_NDEBUG 1 35c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#define LOG_TAG "SignalDrivenThread" 36c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include <utils/Log.h> 37c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 38c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin#include "SignalDrivenThread.h" 39c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 40c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinnamespace android { 41c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 42c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 43c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung ShinSignalDrivenThread::SignalDrivenThread() 4413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang :Thread(false) 45c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin{ 469dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang ALOGV("(SignalDrivenThread() ):"); 4713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang m_processingSignal = 0; 4813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang m_receivedSignal = 0; 499dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang m_isTerminated = false; 50c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} 51c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 5213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kangvoid SignalDrivenThread::Start(const char* name, 5313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int32_t priority, size_t stack) 5413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang{ 5513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ALOGV("DEBUG(SignalDrivenThread::Start() ):"); 5613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang run(name, priority, stack); 5713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang} 58c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung ShinSignalDrivenThread::SignalDrivenThread(const char* name, 59c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin int32_t priority, size_t stack) 60c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin :Thread(false) 61c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin{ 6213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ALOGV("DEBUG(SignalDrivenThread( , , )):"); 63c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin m_processingSignal = 0; 64c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin m_receivedSignal = 0; 659dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang m_isTerminated = false; 66c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin run(name, priority, stack); 67c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin return; 68c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} 69c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 70c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung ShinSignalDrivenThread::~SignalDrivenThread() 71c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin{ 729dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang ALOGD("DEBUG(%s):", __func__); 73c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin return; 74c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} 75c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 76c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinstatus_t SignalDrivenThread::SetSignal(uint32_t signal) 77c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin{ 7813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ALOGV("DEBUG(%s):Setting Signal (%x)", __FUNCTION__, signal); 79c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 80c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin Mutex::Autolock lock(m_signalMutex); 8113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ALOGV("DEBUG(%s):Signal Set (%x) - prev(%x)", __FUNCTION__, signal, m_receivedSignal); 82c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin m_receivedSignal |= signal; 83c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin m_threadCondition.signal(); 84c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin return NO_ERROR; 85c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} 86c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 87c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinuint32_t SignalDrivenThread::GetProcessingSignal() 88c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin{ 8913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ALOGV("DEBUG(%s): Signal (%x)", __FUNCTION__, m_processingSignal); 90c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 912c872806d9418b42ac1e99ea24be190d1970da98hyeonmyeong Choi Mutex::Autolock lock(m_signalMutex); 92c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin return m_processingSignal; 93c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} 94c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 959dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kangbool SignalDrivenThread::IsTerminated() 96c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin{ 972c872806d9418b42ac1e99ea24be190d1970da98hyeonmyeong Choi Mutex::Autolock lock(m_signalMutex); 989dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang return m_isTerminated; 99c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} 100c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 101c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinstatus_t SignalDrivenThread::readyToRun() 102c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin{ 103c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin ALOGV("DEBUG(%s):", __func__); 104c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin return readyToRunInternal(); 105c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} 106c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 107c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 108c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinbool SignalDrivenThread::threadLoop() 109c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin{ 110c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin { 111c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin Mutex::Autolock lock(m_signalMutex); 11213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ALOGV("DEBUG(%s):Waiting Signal", __FUNCTION__); 113c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin while (!m_receivedSignal) 114c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin { 115c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin m_threadCondition.wait(m_signalMutex); 116c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin } 117c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin m_processingSignal = m_receivedSignal; 118c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin m_receivedSignal = 0; 119c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin } 12013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ALOGV("DEBUG(%s):Got Signal (%x)", __FUNCTION__, m_processingSignal); 121c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 122c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin if (m_processingSignal & SIGNAL_THREAD_TERMINATE) 123c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin { 1249dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang ALOGD("(%s): Thread Terminating by SIGNAL", __func__); 1252c872806d9418b42ac1e99ea24be190d1970da98hyeonmyeong Choi Mutex::Autolock lock(m_signalMutex); 1269dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang m_isTerminated = true; 127c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin return (false); 128c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin } 129c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin else if (m_processingSignal & SIGNAL_THREAD_PAUSE) 130c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin { 1319dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang ALOGV("DEBUG(%s):Thread Paused", __func__); 132c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin return (true); 133c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin } 134c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 1352c872806d9418b42ac1e99ea24be190d1970da98hyeonmyeong Choi if (m_isTerminated) 1362c872806d9418b42ac1e99ea24be190d1970da98hyeonmyeong Choi m_isTerminated = false; 1372c872806d9418b42ac1e99ea24be190d1970da98hyeonmyeong Choi 13813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang threadFunctionInternal(); 13913d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang return true; 140c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} 141c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 142c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 143c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin}; // namespace android 144