Skip to content

Commit

Permalink
Fix checking of the guard condition. (#204)
Browse files Browse the repository at this point in the history
* Fix checking of the guard condition.

Previously, when we were checking if a guard condition
was triggered, we would actually check and reset it.
But that means that when we later on went to set the
appropriate things in the wait_set, we wouldn't actually
set the guard_condition true, since it was false by that point.

Instead, add in two separate methods; the one that just
returns whether it is triggered, which we call when checking,
and the one that checks and resets, which we call when
setting it in the wait_set.

Signed-off-by: Chris Lalancette <[email protected]>

* Make has_triggered_condition args const

Signed-off-by: Yadunund <[email protected]>

---------

Signed-off-by: Chris Lalancette <[email protected]>
Signed-off-by: Yadunund <[email protected]>
Co-authored-by: Yadunund <[email protected]>
  • Loading branch information
clalancette and Yadunund authored Jun 21, 2024
1 parent d3396a5 commit 7609e41
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 10 deletions.
9 changes: 7 additions & 2 deletions rmw_zenoh_cpp/src/detail/guard_condition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,16 +53,21 @@ void GuardCondition::detach_condition()
condition_variable_ = nullptr;
}

bool GuardCondition::has_triggered() const
{
std::lock_guard<std::mutex> lock(internal_mutex_);
return has_triggered_;
}

///=============================================================================
bool GuardCondition::get_and_reset_trigger()
{
std::lock_guard<std::mutex> lock(internal_mutex_);
bool ret = has_triggered_;

// There is no data associated with the guard condition, so as soon as the callers asks about the
// state, we can immediately reset and get ready for the next trigger.
has_triggered_ = false;

return ret;
}

} // namespace rmw_zenoh_cpp
2 changes: 2 additions & 0 deletions rmw_zenoh_cpp/src/detail/guard_condition.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ class GuardCondition final

void detach_condition();

bool has_triggered() const;

bool get_and_reset_trigger();

private:
Expand Down
14 changes: 6 additions & 8 deletions rmw_zenoh_cpp/src/rmw_zenoh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3137,20 +3137,18 @@ rmw_destroy_wait_set(rmw_wait_set_t * wait_set)
}

static bool has_triggered_condition(
rmw_subscriptions_t * subscriptions,
rmw_guard_conditions_t * guard_conditions,
rmw_services_t * services,
rmw_clients_t * clients,
rmw_events_t * events)
const rmw_subscriptions_t * const subscriptions,
const rmw_guard_conditions_t * const guard_conditions,
const rmw_services_t * const services,
const rmw_clients_t * const clients,
const rmw_events_t * const events)
{
static_cast<void>(events);

if (guard_conditions) {
for (size_t i = 0; i < guard_conditions->guard_condition_count; ++i) {
rmw_zenoh_cpp::GuardCondition * gc =
static_cast<rmw_zenoh_cpp::GuardCondition *>(guard_conditions->guard_conditions[i]);
if (gc != nullptr) {
if (gc->get_and_reset_trigger()) {
if (gc->has_triggered()) {
return true;
}
}
Expand Down

0 comments on commit 7609e41

Please sign in to comment.