• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @addtogroup MCD_MCDIMPL_DAEMON_SRV
2  * @{
3  * @file
4  *
5  * Thread implementation (pthread abstraction).
6  *
7  * <!-- Copyright Giesecke & Devrient GmbH 2009 - 2012 -->
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  * 3. The name of the author may not be used to endorse or promote
18  *    products derived from this software without specific prior
19  *    written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
22  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
25  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
27  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33 #include "CThread.h"
34 
35 #include "log.h"
36 
37 
38 //------------------------------------------------------------------------------
CThread(void)39 CThread::CThread(void) :
40     m_terminate(false), m_isExiting(false)
41 {
42     m_sem = new CSemaphore();
43 }
44 
45 
46 //------------------------------------------------------------------------------
~CThread(void)47 CThread::~CThread(
48     void
49 )
50 {
51     delete m_sem;
52 }
53 
54 
55 //------------------------------------------------------------------------------
terminate(void)56 void CThread::terminate(
57     void
58 )
59 {
60     m_terminate = true;
61 }
62 
63 
64 //------------------------------------------------------------------------------
isExiting(void)65 bool CThread::isExiting(
66     void
67 )
68 {
69     return m_isExiting;
70 }
71 
72 
73 //------------------------------------------------------------------------------
setExiting(void)74 void CThread::setExiting(
75     void
76 )
77 {
78     m_isExiting = true;
79 }
80 
81 
82 //------------------------------------------------------------------------------
exit(int32_t exitcode)83 void CThread::exit(
84     int32_t exitcode
85 )
86 {
87     setExiting();
88     pthread_exit((void *)exitcode);
89 }
90 
91 
92 //------------------------------------------------------------------------------
shouldTerminate(void)93 bool CThread::shouldTerminate(
94     void
95 )
96 {
97     return m_terminate;
98 }
99 
100 
101 //------------------------------------------------------------------------------
start(void)102 void CThread::start(
103     void
104 )
105 {
106     int ret;
107     ret = pthread_create(&m_thread, NULL, CThreadStartup, this);
108     if (0 != ret)
109         LOG_E("pthread_create failed with error code %d", ret);
110 }
111 
112 
113 //------------------------------------------------------------------------------
join(void)114 void CThread::join(
115     void
116 )
117 {
118     int ret;
119     ret = pthread_join(m_thread, NULL);
120     if (0 != ret)
121         LOG_E("pthread_join failed with error code %d", ret);
122 }
123 
124 
125 //------------------------------------------------------------------------------
sleep(void)126 void CThread::sleep(
127     void
128 )
129 {
130     m_sem->wait();
131 }
132 
133 
134 //------------------------------------------------------------------------------
wakeup(void)135 void CThread::wakeup(
136     void
137 )
138 {
139     m_sem->signal();
140 }
141 
142 
143 //------------------------------------------------------------------------------
CThreadStartup(void * _tgtObject)144 void *CThreadStartup(
145     void *_tgtObject
146 )
147 {
148     CThread *tgtObject = (CThread *) _tgtObject;
149     tgtObject->run();
150     return NULL;
151 }
152 
153 /** @} */
154