From 7bfcdbe7ea96e3a803d9eaa25a1cbd138cb51a0b Mon Sep 17 00:00:00 2001 From: siyangy Date: Thu, 8 Mar 2018 12:05:33 -0800 Subject: [PATCH] Dreamview: fix a relative_map race --- .../simulation_world/simulation_world_service.cc | 7 +++++++ .../simulation_world/simulation_world_updater.cc | 12 ++++++++---- .../simulation_world/simulation_world_updater.h | 3 +++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/modules/dreamview/backend/simulation_world/simulation_world_service.cc b/modules/dreamview/backend/simulation_world/simulation_world_service.cc index 794e3f0e92..3e5a70eeeb 100644 --- a/modules/dreamview/backend/simulation_world/simulation_world_service.cc +++ b/modules/dreamview/backend/simulation_world/simulation_world_service.cc @@ -963,6 +963,13 @@ template <> void SimulationWorldService::UpdateSimulationWorld(const MapMsg &map_msg) { if (map_msg.has_hdmap()) { relative_map_.CopyFrom(map_msg.hdmap()); + for (int i = 0; i < relative_map_.lane_size(); ++i) { + auto *lane = relative_map_.mutable_lane(i); + lane->clear_left_sample(); + lane->clear_right_sample(); + lane->clear_left_road_sample(); + lane->clear_right_road_sample(); + } } } diff --git a/modules/dreamview/backend/simulation_world/simulation_world_updater.cc b/modules/dreamview/backend/simulation_world/simulation_world_updater.cc index 92416aaa23..041c69acbb 100644 --- a/modules/dreamview/backend/simulation_world/simulation_world_updater.cc +++ b/modules/dreamview/backend/simulation_world/simulation_world_updater.cc @@ -81,10 +81,12 @@ void SimulationWorldUpdater::RegisterMessageHandlers() { map_ws_->RegisterMessageHandler( "RetrieveRelativeMapData", [this](const Json &json, WebSocketHandler::Connection *conn) { - std::string retrieved_map_string; - sim_world_service_.GetRelativeMap().SerializeToString( - &retrieved_map_string); - map_ws_->SendBinaryData(conn, retrieved_map_string, true); + std::string to_send; + { + boost::shared_lock reader_lock(mutex_); + to_send = relative_map_string_; + } + map_ws_->SendBinaryData(conn, to_send, true); }); websocket_->RegisterMessageHandler( @@ -348,6 +350,8 @@ void SimulationWorldUpdater::OnTimer(const ros::TimerEvent &event) { sim_world_service_.GetWireFormatString( FLAGS_sim_map_radius, &simulation_world_, &simulation_world_with_planning_data_); + sim_world_service_.GetRelativeMap().SerializeToString( + &relative_map_string_); } } diff --git a/modules/dreamview/backend/simulation_world/simulation_world_updater.h b/modules/dreamview/backend/simulation_world/simulation_world_updater.h index cb7559c7a7..b2b49f5b83 100644 --- a/modules/dreamview/backend/simulation_world/simulation_world_updater.h +++ b/modules/dreamview/backend/simulation_world/simulation_world_updater.h @@ -136,6 +136,9 @@ class SimulationWorldUpdater { std::string simulation_world_; std::string simulation_world_with_planning_data_; + // Received relative map data in wire format. + std::string relative_map_string_; + // Mutex to protect concurrent access to simulation_world_json_. // NOTE: Use boost until we have std version of rwlock support. boost::shared_mutex mutex_; -- GitLab