Commit | Line | Data |
---|---|---|
c15a6b00 JS |
1 | /* |
2 | ** | |
3 | ** Copyright 2008, The Android Open Source Project | |
4 | ** Copyright 2012, Samsung Electronics Co. LTD | |
5 | ** | |
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 | |
9 | ** | |
10 | ** http://www.apache.org/licenses/LICENSE-2.0 | |
11 | ** | |
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. | |
17 | */ | |
18 | ||
19 | /*! | |
20 | * \file SignalDrivenThread.cpp | |
21 | * \brief source file for general thread ( for camera hal2 implementation ) | |
22 | * \author Sungjoong Kang(sj3.kang@samsung.com) | |
23 | * \date 2012/05/31 | |
24 | * | |
25 | * <b>Revision History: </b> | |
26 | * - 2012/05/31 : Sungjoong Kang(sj3.kang@samsung.com) \n | |
27 | * Initial Release | |
13d8c7b4 SK |
28 | * |
29 | * - 2012/07/10 : Sungjoong Kang(sj3.kang@samsung.com) \n | |
30 | * 2nd Release | |
31 | * | |
c15a6b00 | 32 | */ |
13d8c7b4 | 33 | |
9dd63e1f | 34 | //#define LOG_NDEBUG 1 |
c15a6b00 JS |
35 | #define LOG_TAG "SignalDrivenThread" |
36 | #include <utils/Log.h> | |
37 | ||
38 | #include "SignalDrivenThread.h" | |
39 | ||
40 | namespace android { | |
41 | ||
42 | ||
43 | SignalDrivenThread::SignalDrivenThread() | |
13d8c7b4 | 44 | :Thread(false) |
c15a6b00 | 45 | { |
9dd63e1f | 46 | ALOGV("(SignalDrivenThread() ):"); |
13d8c7b4 SK |
47 | m_processingSignal = 0; |
48 | m_receivedSignal = 0; | |
f183cf48 | 49 | m_pendingSignal = 0; |
9dd63e1f | 50 | m_isTerminated = false; |
c15a6b00 JS |
51 | } |
52 | ||
13d8c7b4 SK |
53 | void SignalDrivenThread::Start(const char* name, |
54 | int32_t priority, size_t stack) | |
55 | { | |
56 | ALOGV("DEBUG(SignalDrivenThread::Start() ):"); | |
57 | run(name, priority, stack); | |
58 | } | |
c15a6b00 JS |
59 | SignalDrivenThread::SignalDrivenThread(const char* name, |
60 | int32_t priority, size_t stack) | |
61 | :Thread(false) | |
62 | { | |
13d8c7b4 | 63 | ALOGV("DEBUG(SignalDrivenThread( , , )):"); |
c15a6b00 JS |
64 | m_processingSignal = 0; |
65 | m_receivedSignal = 0; | |
f183cf48 | 66 | m_pendingSignal = 0; |
9dd63e1f | 67 | m_isTerminated = false; |
c15a6b00 JS |
68 | run(name, priority, stack); |
69 | return; | |
70 | } | |
71 | ||
72 | SignalDrivenThread::~SignalDrivenThread() | |
73 | { | |
9dd63e1f | 74 | ALOGD("DEBUG(%s):", __func__); |
c15a6b00 JS |
75 | return; |
76 | } | |
77 | ||
78 | status_t SignalDrivenThread::SetSignal(uint32_t signal) | |
79 | { | |
13d8c7b4 | 80 | ALOGV("DEBUG(%s):Setting Signal (%x)", __FUNCTION__, signal); |
c15a6b00 JS |
81 | |
82 | Mutex::Autolock lock(m_signalMutex); | |
13d8c7b4 | 83 | ALOGV("DEBUG(%s):Signal Set (%x) - prev(%x)", __FUNCTION__, signal, m_receivedSignal); |
f183cf48 SK |
84 | if (m_receivedSignal & signal) { |
85 | m_pendingSignal |= signal; | |
86 | } else { | |
87 | m_receivedSignal |= signal; | |
88 | } | |
c15a6b00 JS |
89 | m_threadCondition.signal(); |
90 | return NO_ERROR; | |
91 | } | |
92 | ||
93 | uint32_t SignalDrivenThread::GetProcessingSignal() | |
94 | { | |
13d8c7b4 | 95 | ALOGV("DEBUG(%s): Signal (%x)", __FUNCTION__, m_processingSignal); |
c15a6b00 | 96 | |
2c872806 | 97 | Mutex::Autolock lock(m_signalMutex); |
c15a6b00 JS |
98 | return m_processingSignal; |
99 | } | |
100 | ||
9dd63e1f | 101 | bool SignalDrivenThread::IsTerminated() |
c15a6b00 | 102 | { |
2c872806 | 103 | Mutex::Autolock lock(m_signalMutex); |
9dd63e1f | 104 | return m_isTerminated; |
c15a6b00 | 105 | } |
c15a6b00 JS |
106 | |
107 | status_t SignalDrivenThread::readyToRun() | |
108 | { | |
109 | ALOGV("DEBUG(%s):", __func__); | |
110 | return readyToRunInternal(); | |
111 | } | |
112 | ||
053d38cf SK |
113 | status_t SignalDrivenThread::readyToRunInternal() |
114 | { | |
115 | ALOGV("DEBUG(%s):", __func__); | |
116 | return NO_ERROR; | |
117 | } | |
c15a6b00 JS |
118 | |
119 | bool SignalDrivenThread::threadLoop() | |
120 | { | |
121 | { | |
122 | Mutex::Autolock lock(m_signalMutex); | |
13d8c7b4 | 123 | ALOGV("DEBUG(%s):Waiting Signal", __FUNCTION__); |
c15a6b00 JS |
124 | while (!m_receivedSignal) |
125 | { | |
126 | m_threadCondition.wait(m_signalMutex); | |
127 | } | |
128 | m_processingSignal = m_receivedSignal; | |
f183cf48 SK |
129 | m_receivedSignal = m_pendingSignal; |
130 | m_pendingSignal = 0; | |
c15a6b00 | 131 | } |
13d8c7b4 | 132 | ALOGV("DEBUG(%s):Got Signal (%x)", __FUNCTION__, m_processingSignal); |
c15a6b00 JS |
133 | |
134 | if (m_processingSignal & SIGNAL_THREAD_TERMINATE) | |
135 | { | |
9dd63e1f | 136 | ALOGD("(%s): Thread Terminating by SIGNAL", __func__); |
2c872806 | 137 | Mutex::Autolock lock(m_signalMutex); |
9dd63e1f | 138 | m_isTerminated = true; |
c15a6b00 JS |
139 | return (false); |
140 | } | |
141 | else if (m_processingSignal & SIGNAL_THREAD_PAUSE) | |
142 | { | |
9dd63e1f | 143 | ALOGV("DEBUG(%s):Thread Paused", __func__); |
c15a6b00 JS |
144 | return (true); |
145 | } | |
146 | ||
2c872806 C |
147 | if (m_isTerminated) |
148 | m_isTerminated = false; | |
149 | ||
13d8c7b4 SK |
150 | threadFunctionInternal(); |
151 | return true; | |
c15a6b00 JS |
152 | } |
153 | ||
154 | ||
155 | }; // namespace android |