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; 49f183cf48de9574ee0066503d931fcdbfbdd04895Sungjoong Kang m_pendingSignal = 0; 509dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang m_isTerminated = false; 51c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} 52c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 5313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kangvoid SignalDrivenThread::Start(const char* name, 5413d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang int32_t priority, size_t stack) 5513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang{ 5613d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ALOGV("DEBUG(SignalDrivenThread::Start() ):"); 5713d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang run(name, priority, stack); 5813d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang} 59c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung ShinSignalDrivenThread::SignalDrivenThread(const char* name, 60c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin int32_t priority, size_t stack) 61c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin :Thread(false) 62c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin{ 6313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ALOGV("DEBUG(SignalDrivenThread( , , )):"); 64c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin m_processingSignal = 0; 65c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin m_receivedSignal = 0; 66f183cf48de9574ee0066503d931fcdbfbdd04895Sungjoong Kang m_pendingSignal = 0; 679dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang m_isTerminated = false; 68c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin run(name, priority, stack); 69c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin return; 70c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} 71c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 72c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung ShinSignalDrivenThread::~SignalDrivenThread() 73c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin{ 749dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang ALOGD("DEBUG(%s):", __func__); 75c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin return; 76c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} 77c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 78c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinstatus_t SignalDrivenThread::SetSignal(uint32_t signal) 79c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin{ 8013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ALOGV("DEBUG(%s):Setting Signal (%x)", __FUNCTION__, signal); 81c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 82c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin Mutex::Autolock lock(m_signalMutex); 8313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ALOGV("DEBUG(%s):Signal Set (%x) - prev(%x)", __FUNCTION__, signal, m_receivedSignal); 84f183cf48de9574ee0066503d931fcdbfbdd04895Sungjoong Kang if (m_receivedSignal & signal) { 85f183cf48de9574ee0066503d931fcdbfbdd04895Sungjoong Kang m_pendingSignal |= signal; 86f183cf48de9574ee0066503d931fcdbfbdd04895Sungjoong Kang } else { 87f183cf48de9574ee0066503d931fcdbfbdd04895Sungjoong Kang m_receivedSignal |= signal; 88f183cf48de9574ee0066503d931fcdbfbdd04895Sungjoong Kang } 89c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin m_threadCondition.signal(); 90c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin return NO_ERROR; 91c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} 92c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 93c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinuint32_t SignalDrivenThread::GetProcessingSignal() 94c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin{ 9513d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ALOGV("DEBUG(%s): Signal (%x)", __FUNCTION__, m_processingSignal); 96c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 972c872806d9418b42ac1e99ea24be190d1970da98hyeonmyeong Choi Mutex::Autolock lock(m_signalMutex); 98c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin return m_processingSignal; 99c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} 100c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 1019dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kangbool SignalDrivenThread::IsTerminated() 102c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin{ 1032c872806d9418b42ac1e99ea24be190d1970da98hyeonmyeong Choi Mutex::Autolock lock(m_signalMutex); 1049dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang return m_isTerminated; 105c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} 106c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 107c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinstatus_t SignalDrivenThread::readyToRun() 108c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin{ 109c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin ALOGV("DEBUG(%s):", __func__); 110c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin return readyToRunInternal(); 111c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} 112c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 113053d38cf3db8e79ccde6996b2c44e77ccff54bfcSungjoong Kangstatus_t SignalDrivenThread::readyToRunInternal() 114053d38cf3db8e79ccde6996b2c44e77ccff54bfcSungjoong Kang{ 115053d38cf3db8e79ccde6996b2c44e77ccff54bfcSungjoong Kang ALOGV("DEBUG(%s):", __func__); 116053d38cf3db8e79ccde6996b2c44e77ccff54bfcSungjoong Kang return NO_ERROR; 117053d38cf3db8e79ccde6996b2c44e77ccff54bfcSungjoong Kang} 118c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 119c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shinbool SignalDrivenThread::threadLoop() 120c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin{ 121c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin { 122c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin Mutex::Autolock lock(m_signalMutex); 12313d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ALOGV("DEBUG(%s):Waiting Signal", __FUNCTION__); 124c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin while (!m_receivedSignal) 125c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin { 126c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin m_threadCondition.wait(m_signalMutex); 127c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin } 128c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin m_processingSignal = m_receivedSignal; 129f183cf48de9574ee0066503d931fcdbfbdd04895Sungjoong Kang m_receivedSignal = m_pendingSignal; 130f183cf48de9574ee0066503d931fcdbfbdd04895Sungjoong Kang m_pendingSignal = 0; 131c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin } 13213d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang ALOGV("DEBUG(%s):Got Signal (%x)", __FUNCTION__, m_processingSignal); 133c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 134c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin if (m_processingSignal & SIGNAL_THREAD_TERMINATE) 135c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin { 1369dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang ALOGD("(%s): Thread Terminating by SIGNAL", __func__); 1372c872806d9418b42ac1e99ea24be190d1970da98hyeonmyeong Choi Mutex::Autolock lock(m_signalMutex); 1389dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang m_isTerminated = true; 139c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin return (false); 140c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin } 141c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin else if (m_processingSignal & SIGNAL_THREAD_PAUSE) 142c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin { 1439dd63e1fc352306d6680c517b7ce9936683c78c4Sungjoong Kang ALOGV("DEBUG(%s):Thread Paused", __func__); 144c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin return (true); 145c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin } 146c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 1472c872806d9418b42ac1e99ea24be190d1970da98hyeonmyeong Choi if (m_isTerminated) 1482c872806d9418b42ac1e99ea24be190d1970da98hyeonmyeong Choi m_isTerminated = false; 1492c872806d9418b42ac1e99ea24be190d1970da98hyeonmyeong Choi 15013d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang threadFunctionInternal(); 15113d8c7b4650fb7897b4291ed9b3d57b19f7d1ccdSungjoong Kang return true; 152c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin} 153c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 154c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin 155c15a6b003394494149ef7d65ae35c38755cb8b93Jiyoung Shin}; // namespace android 156