Skip to content

Commit debcbcb

Browse files
committed
don't use a static ClassLoader instance
- crashes on exit: ros/class_loader#33 - on-demand-unloading works with ros/class_loader#34
1 parent 15a5eef commit debcbcb

File tree

1 file changed

+18
-24
lines changed

1 file changed

+18
-24
lines changed

Diff for: urdf/src/sensor.cpp

+18-24
Original file line numberDiff line numberDiff line change
@@ -89,34 +89,28 @@ SensorMap parseSensors(const std::string &xml_string, const SensorParserMap &par
8989

9090
SensorParserMap getSensorParsers(const std::vector<std::string> &allowed)
9191
{
92-
static boost::mutex PARSER_PLUGIN_LOCK;
93-
static boost::shared_ptr<pluginlib::ClassLoader<urdf::SensorParser> > PARSER_PLUGIN_LOADER;
94-
boost::mutex::scoped_lock _(PARSER_PLUGIN_LOCK);
95-
92+
pluginlib::ClassLoader<urdf::SensorParser> loader("urdf", "urdf::SensorParser");
9693
SensorParserMap parserMap;
9794
try
9895
{
99-
if (!PARSER_PLUGIN_LOADER)
100-
PARSER_PLUGIN_LOADER.reset(new pluginlib::ClassLoader<urdf::SensorParser>("urdf", "urdf::SensorParser"));
101-
102-
const std::vector<std::string> &classes = PARSER_PLUGIN_LOADER->getDeclaredClasses();
103-
for (std::size_t i = 0 ; i < classes.size() ; ++i)
104-
{
105-
// skip this class if not listed in allowed
106-
if (!allowed.empty() && std::find(allowed.begin(), allowed.end(), classes[i]) == allowed.end())
107-
continue;
108-
109-
urdf::SensorParserSharedPtr parser;
110-
try {
111-
parser = PARSER_PLUGIN_LOADER->createInstance(classes[i]);
112-
} catch(const pluginlib::PluginlibException& ex) {
113-
ROS_ERROR_STREAM("Failed to create sensor parser: " << classes[i] << "\n" << ex.what());
114-
}
115-
parserMap.insert(std::make_pair(classes[i], parser));
116-
ROS_DEBUG_STREAM("added sensor parser: " << classes[i]);
96+
const std::vector<std::string> &classes = loader.getDeclaredClasses();
97+
for (std::size_t i = 0 ; i < classes.size() ; ++i)
98+
{
99+
// skip this class if not listed in allowed
100+
if (!allowed.empty() && std::find(allowed.begin(), allowed.end(), classes[i]) == allowed.end())
101+
continue;
102+
103+
urdf::SensorParserSharedPtr parser;
104+
try {
105+
parser = loader.createInstance(classes[i]);
106+
} catch(const pluginlib::PluginlibException& ex) {
107+
ROS_ERROR_STREAM("Failed to create sensor parser: " << classes[i] << "\n" << ex.what());
117108
}
118-
if (parserMap.empty())
119-
ROS_WARN_STREAM("No sensor parsers found");
109+
parserMap.insert(std::make_pair(classes[i], parser));
110+
ROS_DEBUG_STREAM("added sensor parser: " << classes[i]);
111+
}
112+
if (parserMap.empty())
113+
ROS_WARN_STREAM("No sensor parsers found");
120114
}
121115
catch(const pluginlib::PluginlibException& ex)
122116
{

0 commit comments

Comments
 (0)