Skip to content

Commit c468967

Browse files
authored
Make more of the Waitable API abstract (#2593)
* Make Waitable::{is_ready,add_to_wait_set,execute} abstract APIs. I initially started looking at this because clang was complaining that "all paths through this function will call itself". And it is correct; if an implementation does not override these methods, and they are every called, they will go into an infinite loop calling themselves. However, while looking at it it seemed to me that these were really part of the API that a concrete implementation of Waitable needed to implement. It is fine if an implementation doesn't want to do anything (like the tests), but all of the "real" users in the codebase override these. Thus, remove the implementations here and make these pure virtual functions that all subclasses must implement. * Remove some more "empty" implementations. In particular, these are implementations in the Waitable class that only throw exceptions. Rather than do this, make these APIs pure virtual so all downstream classes have to implement them. All of the current users (except for tests) do anyway, and it makes the API much cleaner. Signed-off-by: Chris Lalancette <clalancette@gmail.com>
1 parent 45adf65 commit c468967

File tree

9 files changed

+47
-79
lines changed

9 files changed

+47
-79
lines changed

rclcpp/include/rclcpp/waitable.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ class Waitable
109109
RCLCPP_PUBLIC
110110
virtual
111111
void
112-
add_to_wait_set(rcl_wait_set_t & wait_set);
112+
add_to_wait_set(rcl_wait_set_t & wait_set) = 0;
113113

114114
/// Check if the Waitable is ready.
115115
/**
@@ -124,7 +124,7 @@ class Waitable
124124
RCLCPP_PUBLIC
125125
virtual
126126
bool
127-
is_ready(const rcl_wait_set_t & wait_set);
127+
is_ready(const rcl_wait_set_t & wait_set) = 0;
128128

129129
/// Take the data so that it can be consumed with `execute`.
130130
/**
@@ -176,7 +176,7 @@ class Waitable
176176
RCLCPP_PUBLIC
177177
virtual
178178
std::shared_ptr<void>
179-
take_data_by_entity_id(size_t id);
179+
take_data_by_entity_id(size_t id) = 0;
180180

181181
/// Execute data that is passed in.
182182
/**
@@ -203,7 +203,7 @@ class Waitable
203203
RCLCPP_PUBLIC
204204
virtual
205205
void
206-
execute(const std::shared_ptr<void> & data);
206+
execute(const std::shared_ptr<void> & data) = 0;
207207

208208
/// Exchange the "in use by wait set" state for this timer.
209209
/**
@@ -246,7 +246,7 @@ class Waitable
246246
RCLCPP_PUBLIC
247247
virtual
248248
void
249-
set_on_ready_callback(std::function<void(size_t, int)> callback);
249+
set_on_ready_callback(std::function<void(size_t, int)> callback) = 0;
250250

251251
/// Unset any callback registered via set_on_ready_callback.
252252
/**
@@ -256,7 +256,7 @@ class Waitable
256256
RCLCPP_PUBLIC
257257
virtual
258258
void
259-
clear_on_ready_callback();
259+
clear_on_ready_callback() = 0;
260260

261261
private:
262262
std::atomic<bool> in_use_by_wait_set_{false};

rclcpp/src/rclcpp/waitable.cpp

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -54,54 +54,8 @@ Waitable::get_number_of_ready_guard_conditions()
5454
return 0u;
5555
}
5656

57-
std::shared_ptr<void>
58-
Waitable::take_data_by_entity_id(size_t id)
59-
{
60-
(void)id;
61-
throw std::runtime_error(
62-
"Custom waitables should override take_data_by_entity_id "
63-
"if they want to use it.");
64-
}
65-
6657
bool
6758
Waitable::exchange_in_use_by_wait_set_state(bool in_use_state)
6859
{
6960
return in_use_by_wait_set_.exchange(in_use_state);
7061
}
71-
72-
void
73-
Waitable::set_on_ready_callback(std::function<void(size_t, int)> callback)
74-
{
75-
(void)callback;
76-
77-
throw std::runtime_error(
78-
"Custom waitables should override set_on_ready_callback "
79-
"if they want to use it.");
80-
}
81-
82-
void
83-
Waitable::clear_on_ready_callback()
84-
{
85-
throw std::runtime_error(
86-
"Custom waitables should override clear_on_ready_callback if they "
87-
"want to use it and make sure to call it on the waitable destructor.");
88-
}
89-
90-
bool
91-
Waitable::is_ready(const rcl_wait_set_t & wait_set)
92-
{
93-
return this->is_ready(wait_set);
94-
}
95-
96-
void
97-
Waitable::add_to_wait_set(rcl_wait_set_t & wait_set)
98-
{
99-
this->add_to_wait_set(wait_set);
100-
}
101-
102-
void
103-
Waitable::execute(const std::shared_ptr<void> & data)
104-
{
105-
// note this const cast is only required to support a deprecated function
106-
this->execute(const_cast<std::shared_ptr<void> &>(data));
107-
}

rclcpp/test/rclcpp/node_interfaces/test_node_waitables.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ class TestWaitable : public rclcpp::Waitable
3131
void add_to_wait_set(rcl_wait_set_t &) override {}
3232
bool is_ready(const rcl_wait_set_t &) override {return false;}
3333

34-
std::shared_ptr<void>
35-
take_data() override
36-
{
37-
return nullptr;
38-
}
39-
34+
std::shared_ptr<void> take_data() override {return nullptr;}
4035
void execute(const std::shared_ptr<void> &) override {}
36+
37+
void set_on_ready_callback(std::function<void(size_t, int)>) override {}
38+
void clear_on_ready_callback() override {}
39+
40+
std::shared_ptr<void> take_data_by_entity_id(size_t) override {return nullptr;}
4141
};
4242

4343
class TestNodeWaitables : public ::testing::Test

rclcpp/test/rclcpp/strategies/test_allocator_memory_strategy.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,13 @@ class TestWaitable : public rclcpp::Waitable
5151
return test_waitable_result;
5252
}
5353

54-
std::shared_ptr<void>
55-
take_data() override
56-
{
57-
return nullptr;
58-
}
59-
54+
std::shared_ptr<void> take_data() override {return nullptr;}
6055
void execute(const std::shared_ptr<void> &) override {}
56+
57+
void set_on_ready_callback(std::function<void(size_t, int)>) override {}
58+
void clear_on_ready_callback() override {}
59+
60+
std::shared_ptr<void> take_data_by_entity_id(size_t) override {return nullptr;}
6161
};
6262

6363
struct RclWaitSetSizes

rclcpp/test/rclcpp/test_memory_strategy.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ class TestWaitable : public rclcpp::Waitable
4040

4141
std::shared_ptr<void> take_data() override {return nullptr;}
4242
void execute(const std::shared_ptr<void> &) override {}
43+
44+
void set_on_ready_callback(std::function<void(size_t, int)>) override {}
45+
void clear_on_ready_callback() override {}
46+
47+
std::shared_ptr<void> take_data_by_entity_id(size_t) override {return nullptr;}
4348
};
4449

4550
class TestMemoryStrategy : public ::testing::Test

rclcpp/test/rclcpp/wait_set_policies/test_dynamic_storage.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,18 @@ class TestWaitable : public rclcpp::Waitable
5252
: is_ready_(false) {}
5353

5454
void add_to_wait_set(rcl_wait_set_t &) override {}
55-
5655
bool is_ready(const rcl_wait_set_t &) override {return is_ready_;}
5756

5857
std::shared_ptr<void> take_data() override {return nullptr;}
59-
60-
void
61-
execute(const std::shared_ptr<void> &) override {}
58+
void execute(const std::shared_ptr<void> &) override {}
6259

6360
void set_is_ready(bool value) {is_ready_ = value;}
6461

62+
void set_on_ready_callback(std::function<void(size_t, int)>) override {}
63+
void clear_on_ready_callback() override {}
64+
65+
std::shared_ptr<void> take_data_by_entity_id(size_t) override {return nullptr;}
66+
6567
private:
6668
bool is_ready_;
6769
};

rclcpp/test/rclcpp/wait_set_policies/test_static_storage.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,18 @@ class TestWaitable : public rclcpp::Waitable
5252
: is_ready_(false) {}
5353

5454
void add_to_wait_set(rcl_wait_set_t &) override {}
55-
5655
bool is_ready(const rcl_wait_set_t &) override {return is_ready_;}
5756

5857
std::shared_ptr<void> take_data() override {return nullptr;}
59-
60-
void
61-
execute(const std::shared_ptr<void> &) override {}
58+
void execute(const std::shared_ptr<void> &) override {}
6259

6360
void set_is_ready(bool value) {is_ready_ = value;}
6461

62+
void set_on_ready_callback(std::function<void(size_t, int)>) override {}
63+
void clear_on_ready_callback() override {}
64+
65+
std::shared_ptr<void> take_data_by_entity_id(size_t) override {return nullptr;}
66+
6567
private:
6668
bool is_ready_;
6769
};

rclcpp/test/rclcpp/wait_set_policies/test_storage_policy_common.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,17 @@ class TestWaitable : public rclcpp::Waitable
6161
bool is_ready(const rcl_wait_set_t &) override {return is_ready_;}
6262

6363
std::shared_ptr<void> take_data() override {return nullptr;}
64-
65-
void
66-
execute(const std::shared_ptr<void> & data) override {(void)data;}
64+
void execute(const std::shared_ptr<void> &) override {}
6765

6866
void set_is_ready(bool value) {is_ready_ = value;}
6967

7068
void set_add_to_wait_set(bool value) {add_to_wait_set_ = value;}
7169

70+
void set_on_ready_callback(std::function<void(size_t, int)>) override {}
71+
void clear_on_ready_callback() override {}
72+
73+
std::shared_ptr<void> take_data_by_entity_id(size_t) override {return nullptr;}
74+
7275
private:
7376
bool is_ready_;
7477
bool add_to_wait_set_;

rclcpp/test/rclcpp/wait_set_policies/test_thread_safe_synchronization.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,18 @@ class TestWaitable : public rclcpp::Waitable
5252
: is_ready_(false) {}
5353

5454
void add_to_wait_set(rcl_wait_set_t &) override {}
55-
5655
bool is_ready(const rcl_wait_set_t &) override {return is_ready_;}
5756

5857
std::shared_ptr<void> take_data() override {return nullptr;}
59-
60-
void
61-
execute(const std::shared_ptr<void> &) override {}
58+
void execute(const std::shared_ptr<void> &) override {}
6259

6360
void set_is_ready(bool value) {is_ready_ = value;}
6461

62+
void set_on_ready_callback(std::function<void(size_t, int)>) override {}
63+
void clear_on_ready_callback() override {}
64+
65+
std::shared_ptr<void> take_data_by_entity_id(size_t) override {return nullptr;}
66+
6567
private:
6668
bool is_ready_;
6769
};

0 commit comments

Comments
 (0)