23 #include "fatal-error.h"
24 #include "system-condition.h"
34 static const uint64_t NS_PER_SEC = (uint64_t)1000000000;
39 void SetCondition (
bool condition);
40 bool GetCondition (
void);
42 void Broadcast (
void);
44 bool TimedWait (uint64_t ns);
47 pthread_mutex_t m_mutex;
48 pthread_cond_t m_cond;
52 SystemConditionPrivate::SystemConditionPrivate ()
58 pthread_mutexattr_t mAttr;
59 pthread_mutexattr_init (&mAttr);
64 #if defined (PTHREAD_MUTEX_ERRORCHECK_NP)
65 pthread_mutexattr_settype (&mAttr, PTHREAD_MUTEX_ERRORCHECK_NP);
67 pthread_mutexattr_settype (&mAttr, PTHREAD_MUTEX_ERRORCHECK);
69 pthread_mutex_init (&m_mutex, &mAttr);
71 pthread_condattr_t cAttr;
72 pthread_condattr_init (&cAttr);
73 pthread_condattr_setpshared (&cAttr, PTHREAD_PROCESS_PRIVATE);
74 pthread_cond_init (&m_cond, &cAttr);
77 SystemConditionPrivate::~SystemConditionPrivate()
80 pthread_mutex_destroy (&m_mutex);
81 pthread_cond_destroy (&m_cond);
85 SystemConditionPrivate::SetCondition (
bool condition)
88 m_condition = condition;
92 SystemConditionPrivate::GetCondition (
void)
99 SystemConditionPrivate::Signal (
void)
103 pthread_mutex_lock (&m_mutex);
104 pthread_cond_signal (&m_cond);
105 pthread_mutex_unlock (&m_mutex);
109 SystemConditionPrivate::Broadcast (
void)
113 pthread_mutex_lock (&m_mutex);
114 pthread_cond_broadcast (&m_cond);
115 pthread_mutex_unlock (&m_mutex);
119 SystemConditionPrivate::Wait (
void)
123 pthread_mutex_lock (&m_mutex);
125 while (m_condition ==
false)
127 pthread_cond_wait (&m_cond, &m_mutex);
129 pthread_mutex_unlock (&m_mutex);
133 SystemConditionPrivate::TimedWait (uint64_t ns)
138 ts.tv_sec = ns / NS_PER_SEC;
139 ts.tv_nsec = ns % NS_PER_SEC;
142 gettimeofday (&tv, NULL);
144 ts.tv_sec += tv.tv_sec;
145 ts.tv_nsec += tv.tv_usec * 1000;
146 if (ts.tv_nsec > (int64_t)NS_PER_SEC)
149 ts.tv_nsec %= NS_PER_SEC;
154 pthread_mutex_lock (&m_mutex);
155 while (m_condition ==
false)
157 rc = pthread_cond_timedwait (&m_cond, &m_mutex, &ts);
160 pthread_mutex_unlock (&m_mutex);
164 pthread_mutex_unlock (&m_mutex);
168 SystemCondition::SystemCondition()
169 : m_priv (new SystemConditionPrivate ())
174 SystemCondition::~SystemCondition ()
184 m_priv->SetCondition (condition);
191 return m_priv->GetCondition ();
205 m_priv->Broadcast ();
219 return m_priv->TimedWait (ns);
#define NS_LOG_FUNCTION(parameters)
#define NS_LOG_COMPONENT_DEFINE(name)
void SetCondition(bool condition)
bool TimedWait(uint64_t ns)