Skip to content

Commit 06ecc67

Browse files
authored
fix(bvp): remove expired module safely (#9212)
* fix(bvp): remove expired module safely Signed-off-by: satoshi-ota <satoshi.ota928@gmail.com> * fix: remove module id set Signed-off-by: satoshi-ota <satoshi.ota928@gmail.com> * fix: use itr to erase expired module Signed-off-by: satoshi-ota <satoshi.ota928@gmail.com> * fix: remove unused function Signed-off-by: satoshi-ota <satoshi.ota928@gmail.com> --------- Signed-off-by: satoshi-ota <satoshi.ota928@gmail.com>
1 parent 1a9683e commit 06ecc67

File tree

3 files changed

+26
-39
lines changed

3 files changed

+26
-39
lines changed

planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/manager.cpp

+10-10
Original file line numberDiff line numberDiff line change
@@ -450,20 +450,20 @@ void IntersectionModuleManager::deleteExpiredModules(
450450
{
451451
const auto isModuleExpired = getModuleExpiredFunction(path);
452452

453-
// Copy container to avoid iterator corruption
454-
// due to scene_modules_.erase() in unregisterModule()
455-
const auto copied_scene_modules = scene_modules_;
456-
457-
for (const auto & scene_module : copied_scene_modules) {
458-
if (isModuleExpired(scene_module)) {
453+
auto itr = scene_modules_.begin();
454+
while (itr != scene_modules_.end()) {
455+
if (isModuleExpired(*itr)) {
459456
// default
460-
removeRTCStatus(getUUID(scene_module->getModuleId()));
461-
removeUUID(scene_module->getModuleId());
457+
removeRTCStatus(getUUID((*itr)->getModuleId()));
458+
removeUUID((*itr)->getModuleId());
462459
// occlusion
463-
const auto intersection_module = std::dynamic_pointer_cast<IntersectionModule>(scene_module);
460+
const auto intersection_module = std::dynamic_pointer_cast<IntersectionModule>(*itr);
464461
const auto occlusion_uuid = intersection_module->getOcclusionUUID();
465462
occlusion_rtc_interface_.removeCooperateStatus(occlusion_uuid);
466-
unregisterModule(scene_module);
463+
registered_module_id_set_.erase((*itr)->getModuleId());
464+
itr = scene_modules_.erase(itr);
465+
} else {
466+
itr++;
467467
}
468468
}
469469
}

planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp

-2
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,6 @@ class SceneModuleManagerInterface
198198

199199
void registerModule(const std::shared_ptr<SceneModuleInterface> & scene_module);
200200

201-
void unregisterModule(const std::shared_ptr<SceneModuleInterface> & scene_module);
202-
203201
size_t findEgoSegmentIndex(
204202
const std::vector<tier4_planning_msgs::msg::PathPointWithLaneId> & points) const;
205203

planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/src/scene_module_interface.cpp

+16-27
Original file line numberDiff line numberDiff line change
@@ -170,13 +170,12 @@ void SceneModuleManagerInterface::deleteExpiredModules(
170170
{
171171
const auto isModuleExpired = getModuleExpiredFunction(path);
172172

173-
// Copy container to avoid iterator corruption
174-
// due to scene_modules_.erase() in unregisterModule()
175-
const auto copied_scene_modules = scene_modules_;
176-
177-
for (const auto & scene_module : copied_scene_modules) {
178-
if (isModuleExpired(scene_module)) {
179-
unregisterModule(scene_module);
173+
auto itr = scene_modules_.begin();
174+
while (itr != scene_modules_.end()) {
175+
if (isModuleExpired(*itr)) {
176+
itr = scene_modules_.erase(itr);
177+
} else {
178+
itr++;
180179
}
181180
}
182181
}
@@ -191,16 +190,6 @@ void SceneModuleManagerInterface::registerModule(
191190
scene_modules_.insert(scene_module);
192191
}
193192

194-
void SceneModuleManagerInterface::unregisterModule(
195-
const std::shared_ptr<SceneModuleInterface> & scene_module)
196-
{
197-
RCLCPP_DEBUG(
198-
logger_, "unregister task: module = %s, id = %lu", getModuleName(),
199-
scene_module->getModuleId());
200-
registered_module_id_set_.erase(scene_module->getModuleId());
201-
scene_modules_.erase(scene_module);
202-
}
203-
204193
SceneModuleManagerInterfaceWithRTC::SceneModuleManagerInterfaceWithRTC(
205194
rclcpp::Node & node, const char * module_name, const bool enable_rtc)
206195
: SceneModuleManagerInterface(node, module_name),
@@ -278,18 +267,18 @@ void SceneModuleManagerInterfaceWithRTC::deleteExpiredModules(
278267
{
279268
const auto isModuleExpired = getModuleExpiredFunction(path);
280269

281-
// Copy container to avoid iterator corruption
282-
// due to scene_modules_.erase() in unregisterModule()
283-
const auto copied_scene_modules = scene_modules_;
284-
285-
for (const auto & scene_module : copied_scene_modules) {
286-
if (isModuleExpired(scene_module)) {
287-
const UUID uuid = getUUID(scene_module->getModuleId());
270+
auto itr = scene_modules_.begin();
271+
while (itr != scene_modules_.end()) {
272+
if (isModuleExpired(*itr)) {
273+
const UUID uuid = getUUID((*itr)->getModuleId());
288274
updateRTCStatus(
289-
uuid, scene_module->isSafe(), State::SUCCEEDED, std::numeric_limits<double>::lowest(),
275+
uuid, (*itr)->isSafe(), State::SUCCEEDED, std::numeric_limits<double>::lowest(),
290276
clock_->now());
291-
removeUUID(scene_module->getModuleId());
292-
unregisterModule(scene_module);
277+
removeUUID((*itr)->getModuleId());
278+
registered_module_id_set_.erase((*itr)->getModuleId());
279+
itr = scene_modules_.erase(itr);
280+
} else {
281+
itr++;
293282
}
294283
}
295284
}

0 commit comments

Comments
 (0)