Skip to content

Commit 5342aeb

Browse files
committed
add some setters and update unit tests
1 parent cb33ea8 commit 5342aeb

2 files changed

Lines changed: 52 additions & 4 deletions

File tree

src/System/include/BipedalLocomotion/System/PeriodicThread.h

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,25 @@ class PeriodicThread
109109
*/
110110
bool setPolicy(int policy, int priority = 0);
111111

112+
/**
113+
* @brief Set the maximum number of accepted deadline miss.
114+
* @param maximumNumberOfAcceptedDeadlineMiss maximum number of accepted deadline miss.
115+
*/
116+
bool setMaximumNumberOfAcceptedDeadlineMiss(int maximumNumberOfAcceptedDeadlineMiss);
117+
118+
/**
119+
* @brief Get the number of deadline miss.
120+
* @return number of deadline miss.
121+
*/
122+
int getNumberOfDeadlineMiss();
123+
124+
/**
125+
* @brief Enable the early wake up. The thread will be awaken before and busy wait until the
126+
* actual wake up time.
127+
* @return true if the early wake up was correctly set, false otherwise.
128+
*/
129+
bool enableEarlyWakeUp();
130+
112131
protected:
113132
/**
114133
* @brief This method is called at each iteration of the thread.
@@ -153,12 +172,11 @@ class PeriodicThread
153172
* miss.
154173
*/
155174

156-
int m_deadlineMiss = 0; /**< Number of deadline miss. */
175+
std::atomic<int> m_deadlineMiss = 0; /**< Number of deadline miss. */
157176

158177
std::chrono::nanoseconds m_wakeUpTime = std::chrono::nanoseconds(0); /**< Wake up time of the
159178
* thread.
160179
*/
161-
162180
int m_priority = 0; /**< Priority of the thread. */
163181

164182
int m_policy = SCHED_OTHER; /**< Policy of the thread. */

src/System/src/PeriodicThread.cpp

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,36 @@ bool PeriodicThread::setPeriod(std::chrono::nanoseconds period)
115115
return true;
116116
}
117117

118+
bool PeriodicThread::setMaximumNumberOfAcceptedDeadlineMiss(int maximumNumberOfAcceptedDeadlineMiss)
119+
{
120+
if (m_state.load() != PeriodicThreadState::INACTIVE)
121+
{
122+
BipedalLocomotion::log()->error("[PeriodicThread::setMaximumNumberOfAcceptedDeadlineMiss] "
123+
"The thread has already started. The maximum number of "
124+
"accepted deadline miss cannot be changed.");
125+
return false;
126+
}
127+
m_maximumNumberOfAcceptedDeadlineMiss = maximumNumberOfAcceptedDeadlineMiss;
128+
return true;
129+
}
130+
131+
int PeriodicThread::getNumberOfDeadlineMiss()
132+
{
133+
return m_deadlineMiss.load();
134+
}
135+
136+
bool PeriodicThread::enableEarlyWakeUp()
137+
{
138+
if (m_state.load() != PeriodicThreadState::INACTIVE)
139+
{
140+
BipedalLocomotion::log()->error("[PeriodicThread::enableEarlyWakeUp] The thread has "
141+
"already started. The early wake up cannot be changed.");
142+
return false;
143+
}
144+
m_earlyWakeUp = true;
145+
return true;
146+
}
147+
118148
bool PeriodicThread::threadInit()
119149
{
120150
return true;
@@ -232,10 +262,10 @@ void PeriodicThread::advance()
232262
// check if the deadline is missed
233263
if (BipedalLocomotion::clock().now() > m_wakeUpTime)
234264
{
235-
m_deadlineMiss++;
265+
m_deadlineMiss.fetch_add(1); // increment the number of deadline miss
236266
if (m_maximumNumberOfAcceptedDeadlineMiss > 0)
237267
{
238-
if (m_deadlineMiss > m_maximumNumberOfAcceptedDeadlineMiss)
268+
if (m_deadlineMiss.load() > m_maximumNumberOfAcceptedDeadlineMiss)
239269
{
240270
// we have to close the runner
241271
m_state.store(PeriodicThreadState::STOPPED);

0 commit comments

Comments
 (0)