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