Skip to content

Commit

Permalink
fix: Race condition on quickly setting and getting config (#188) (#190)
Browse files Browse the repository at this point in the history
* fix: Race condition on quickly setting and getting config

fixes #187 by using the server's response to the set service to
update the latest configuration.

* test: add test for single threaded set and get using c++ client
  • Loading branch information
rokusottervanger committed Feb 19, 2022
1 parent 7a31583 commit 108879b
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 0 deletions.
2 changes: 2 additions & 0 deletions include/dynamic_reconfigure/client.h
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,8 @@ class Client {
configuration.__toMessage__(srv.request.config);
if (set_service_.call(srv)) {
configuration.__fromMessage__(srv.response.config);
latest_configuration_.__fromMessage__(srv.response.config);
received_configuration_ = true;
return true;
} else {
ROS_WARN("Could not set configuration");
Expand Down
6 changes: 6 additions & 0 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
add_rostest_gtest(dynamic_reconfigure-test_client_single_threaded test_cpp_client_single_threaded.test test_client_single_threaded.cpp)
add_dependencies(dynamic_reconfigure-test_client_single_threaded ${PROJECT_NAME}_gencfg ${PROJECT_NAME}_generate_messages_cpp)
target_link_libraries(dynamic_reconfigure-test_client_single_threaded dynamic_reconfigure_config_init_mutex ${catkin_LIBRARIES})

add_dependencies(tests dynamic_reconfigure-test_client_single_threaded)

add_executable(dynamic_reconfigure-ref_server EXCLUDE_FROM_ALL ref_server.cpp)
add_dependencies(dynamic_reconfigure-ref_server ${PROJECT_NAME}_gencfg ${PROJECT_NAME}_generate_messages_cpp ${PROJECT_NAME}_generate_messages_py)
target_link_libraries(dynamic_reconfigure-ref_server dynamic_reconfigure_config_init_mutex ${catkin_LIBRARIES})
Expand Down
24 changes: 24 additions & 0 deletions test/test_client_single_threaded.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#include <ros/ros.h>
#include <gtest/gtest.h>
#include <dynamic_reconfigure/client.h>
#include <dynamic_reconfigure/TestConfig.h>

using namespace dynamic_reconfigure_test;
using namespace dynamic_reconfigure;


TestConfig CONFIG;

TEST(dynamic_reconfigure_client_single_thread, singleThreadedSetGet) {
Client<TestConfig> client("/ref_server");
CONFIG = TestConfig::__getDefault__();
EXPECT_TRUE(client.setConfiguration(CONFIG));
EXPECT_TRUE(client.getCurrentConfiguration(CONFIG));
}

int main(int argc, char** argv)
{
ros::init(argc, argv, "dynamic_reconfigure_single_threaded_client_test");
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
5 changes: 5 additions & 0 deletions test/test_cpp_client_single_threaded.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<launch>
<node pkg="dynamic_reconfigure" type="dynamic_reconfigure-ref_server" name="ref_server" output="screen" />

<test test-name="dynamic_reconfigure_single_threaded_client_test" pkg="dynamic_reconfigure" type="dynamic_reconfigure-test_client_single_threaded" time-limit="1.0"/>
</launch>

0 comments on commit 108879b

Please sign in to comment.