3 ** Copyright 2008, The Android Open Source Project
4 ** Copyright 2012, Samsung Electronics Co. LTD
6 ** Licensed under the Apache License, Version 2.0 (the "License");
7 ** you may not use this file except in compliance with the License.
8 ** You may obtain a copy of the License at
10 ** http://www.apache.org/licenses/LICENSE-2.0
12 ** Unless required by applicable law or agreed to in writing, software
13 ** distributed under the License is distributed on an "AS IS" BASIS,
14 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 ** See the License for the specific language governing permissions and
16 ** limitations under the License.
20 * \file SignalDrivenThread.cpp
21 * \brief source file for general thread ( for camera hal2 implementation )
22 * \author Sungjoong Kang(sj3.kang@samsung.com)
25 * <b>Revision History: </b>
26 * - 2012/05/31 : Sungjoong Kang(sj3.kang@samsung.com) \n
29 * - 2012/07/10 : Sungjoong Kang(sj3.kang@samsung.com) \n
34 //#define LOG_NDEBUG 1
35 #define LOG_TAG "SignalDrivenThread"
36 #include <utils/Log.h>
38 #include "SignalDrivenThread.h"
43 SignalDrivenThread::SignalDrivenThread()
46 ALOGV("(SignalDrivenThread() ):");
47 m_processingSignal
= 0;
50 m_isTerminated
= false;
53 void SignalDrivenThread::Start(const char* name
,
54 int32_t priority
, size_t stack
)
56 ALOGV("DEBUG(SignalDrivenThread::Start() ):");
57 run(name
, priority
, stack
);
59 SignalDrivenThread::SignalDrivenThread(const char* name
,
60 int32_t priority
, size_t stack
)
63 ALOGV("DEBUG(SignalDrivenThread( , , )):");
64 m_processingSignal
= 0;
67 m_isTerminated
= false;
68 run(name
, priority
, stack
);
72 SignalDrivenThread::~SignalDrivenThread()
74 ALOGD("DEBUG(%s):", __func__
);
78 status_t
SignalDrivenThread::SetSignal(uint32_t signal
)
80 ALOGV("DEBUG(%s):Setting Signal (%x)", __FUNCTION__
, signal
);
82 Mutex::Autolock
lock(m_signalMutex
);
83 ALOGV("DEBUG(%s):Signal Set (%x) - prev(%x)", __FUNCTION__
, signal
, m_receivedSignal
);
84 if (m_receivedSignal
& signal
) {
85 m_pendingSignal
|= signal
;
87 m_receivedSignal
|= signal
;
89 m_threadCondition
.signal();
93 uint32_t SignalDrivenThread::GetProcessingSignal()
95 ALOGV("DEBUG(%s): Signal (%x)", __FUNCTION__
, m_processingSignal
);
97 Mutex::Autolock
lock(m_signalMutex
);
98 return m_processingSignal
;
101 bool SignalDrivenThread::IsTerminated()
103 Mutex::Autolock
lock(m_signalMutex
);
104 return m_isTerminated
;
107 status_t
SignalDrivenThread::readyToRun()
109 ALOGV("DEBUG(%s):", __func__
);
110 return readyToRunInternal();
113 status_t
SignalDrivenThread::readyToRunInternal()
115 ALOGV("DEBUG(%s):", __func__
);
119 bool SignalDrivenThread::threadLoop()
122 Mutex::Autolock
lock(m_signalMutex
);
123 ALOGV("DEBUG(%s):Waiting Signal", __FUNCTION__
);
124 while (!m_receivedSignal
)
126 m_threadCondition
.wait(m_signalMutex
);
128 m_processingSignal
= m_receivedSignal
;
129 m_receivedSignal
= m_pendingSignal
;
132 ALOGV("DEBUG(%s):Got Signal (%x)", __FUNCTION__
, m_processingSignal
);
134 if (m_processingSignal
& SIGNAL_THREAD_TERMINATE
)
136 ALOGD("(%s): Thread Terminating by SIGNAL", __func__
);
137 Mutex::Autolock
lock(m_signalMutex
);
138 m_isTerminated
= true;
141 else if (m_processingSignal
& SIGNAL_THREAD_PAUSE
)
143 ALOGV("DEBUG(%s):Thread Paused", __func__
);
148 m_isTerminated
= false;
150 threadFunctionInternal();
155 }; // namespace android