Skip to content

Commit c12db38

Browse files
committed
fix: add device_map mutex
1 parent 3bf5db8 commit c12db38

2 files changed

Lines changed: 20 additions & 3 deletions

File tree

src/kernel.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,7 @@ void kernel::add_service(
303303
owner.c_str(), name.c_str(), service_definition.c_str());
304304
return;
305305
}
306+
log(warning, "debug: add_service %s.%s\n", owner.c_str(), name.c_str());
306307

307308
log(verbose, "adding service owner \"%s\", name \"%s\", service_definition:\n%s\n",
308309
owner.c_str(), name.c_str(), service_definition.c_str());
@@ -329,6 +330,8 @@ void kernel::remove_service(const std::string& owner, const std::string& name) {
329330
if ((it = service_map.find(std::make_pair(owner, name))) == service_map.end())
330331
return; // service not found
331332

333+
log(warning, "debug: remove_service %s.%s\n", owner.c_str(), name.c_str());
334+
332335
for (const auto& kv : bridge_map)
333336
kv.second->remove_service(*(it->second));
334337

@@ -519,6 +522,7 @@ const std::string kernel::get_pd_definition(const std::string&name) {
519522
void kernel::remove_pd_definition(const std::string& name) {
520523
bool used = false;
521524

525+
std::unique_lock<std::recursive_mutex> lock(device_map_mtx);
522526
for (const auto& dev : device_map) {
523527
auto pddev = dynamic_pointer_cast<process_data>(dev.second);
524528
if (pddev) {
@@ -1062,6 +1066,7 @@ void kernel::add_device_listener(sp_device_listener_t dl) {
10621066

10631067
dl_map[key] = dl;
10641068

1069+
std::unique_lock<std::recursive_mutex> lock(device_map_mtx);
10651070
for (const auto& kv : device_map)
10661071
dl->notify_add_device(kv.second);
10671072
}
@@ -1076,6 +1081,7 @@ void kernel::remove_device_listener(sp_device_listener_t dl) {
10761081
return;
10771082
}
10781083

1084+
std::unique_lock<std::recursive_mutex> lock(device_map_mtx);
10791085
for (const auto& kv : device_map)
10801086
dl_map[key]->notify_remove_device(kv.second);
10811087

@@ -1086,6 +1092,7 @@ void kernel::remove_device_listener(sp_device_listener_t dl) {
10861092
// add a named device
10871093
void kernel::add_device(sp_device_t req) {
10881094
auto map_index = req->id();
1095+
std::unique_lock<std::recursive_mutex> lock(device_map_mtx);
10891096
if (device_map.find(map_index) != device_map.end()) {
10901097
log(warning, "duplicate regiser of device \"%s\", ignoring new device!\n", map_index.c_str());
10911098
return; // already in
@@ -1122,6 +1129,7 @@ void kernel::remove_device(sp_device_t req) {
11221129
for (const auto& kv : dl_map)
11231130
kv.second->notify_remove_device(req);
11241131

1132+
std::unique_lock<std::recursive_mutex> lock(device_map_mtx);
11251133
auto it = device_map.find(map_index);
11261134
if (it == device_map.end())
11271135
return; // no device with name found
@@ -1132,6 +1140,7 @@ void kernel::remove_device(sp_device_t req) {
11321140

11331141
// remove all devices from owner
11341142
void kernel::remove_devices(const std::string& owner) {
1143+
std::unique_lock<std::recursive_mutex> lock(device_map_mtx);
11351144
for (auto it = device_map.begin(); it != device_map.end(); ) {
11361145
if (it->second->owner == owner) {
11371146
log(verbose, "removing device %s\n", it->second->id().c_str());
@@ -1334,6 +1343,7 @@ void kernel::svc_list_devices(
13341343
const struct services::robotkernel::kernel::svc_req_list_devices& req,
13351344
struct services::robotkernel::kernel::svc_resp_list_devices& resp)
13361345
{
1346+
std::unique_lock<std::recursive_mutex> lock(device_map_mtx);
13371347
for (const auto& kv : device_map) {
13381348
resp.devices.push_back(kv.first);
13391349
}
@@ -1350,6 +1360,7 @@ void kernel::svc_process_data_info(
13501360
{
13511361
resp.error_message = "";
13521362

1363+
std::unique_lock<std::recursive_mutex> lock(device_map_mtx);
13531364
if (device_map.find(req.name) != device_map.end()) {
13541365
const auto& pd = std::dynamic_pointer_cast<process_data>(device_map[req.name]);
13551366

@@ -1384,6 +1395,7 @@ void kernel::svc_trigger_info(
13841395
resp.rate = 0.;
13851396
resp.error_message = "";
13861397

1398+
std::unique_lock<std::recursive_mutex> lock(device_map_mtx);
13871399
if (device_map.find(req.name) != device_map.end()) {
13881400
const auto& dev = std::dynamic_pointer_cast<trigger>(device_map[req.name]);
13891401

@@ -1411,6 +1423,7 @@ void kernel::svc_stream_info(
14111423
resp.owner = "";
14121424
resp.error_message = "";
14131425

1426+
std::unique_lock<std::recursive_mutex> lock(device_map_mtx);
14141427
if (device_map.find(req.name) != device_map.end()) {
14151428
const auto& dev = std::dynamic_pointer_cast<stream>(device_map[req.name]);
14161429

@@ -1437,6 +1450,7 @@ void kernel::svc_service_interface_info(
14371450
resp.owner = "";
14381451
resp.error_message = "";
14391452

1453+
std::unique_lock<std::recursive_mutex> lock(device_map_mtx);
14401454
if (device_map.find(req.name) != device_map.end()) {
14411455
const auto& dev = std::dynamic_pointer_cast<service_interface>(device_map[req.name]);
14421456

@@ -1516,6 +1530,7 @@ void kernel::svc_list_pd_injections(
15161530
{
15171531
resp.error_message = "";
15181532

1533+
std::unique_lock<std::recursive_mutex> lock(device_map_mtx);
15191534
for (const auto& kv : device_map) {
15201535
std::shared_ptr<pd_injection_base> retval =
15211536
std::dynamic_pointer_cast<pd_injection_base>(kv.second);

src/kernel.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,16 +99,16 @@ class kernel :
9999
module_map_t module_map; /*!< @brief Map of loaded modules. */
100100
std::recursive_mutex module_map_mtx; /*!< @brief Mutex to protect access to the module map. */
101101
service_map_t service_map; /*!< @brief Map of registered services. */
102-
std::recursive_mutex service_map_mtx; /*!< @brief Mutex to protect access to the module map. */
102+
std::recursive_mutex service_map_mtx; /*!< @brief Mutex to protect access to the service map. */
103103
device_listener_map_t dl_map; /*!< @brief Map of device listeners. */
104+
std::recursive_mutex device_map_mtx; /*!< @brief Mutex to protect access to the device map. */
105+
device_map_t device_map; /*!< @brief Map of the devices. */
104106

105107
typedef std::map<std::string, std::string> string_map_t;
106108
string_map_t datatypes_map;
107109
string_map_t service_definitions_map;
108110
string_map_t pd_definitions_map;
109111

110-
device_map_t device_map;
111-
112112
int trace_fd = 0;
113113
bool log_to_trace_fd = false;
114114

@@ -500,6 +500,8 @@ class kernel :
500500
*/
501501
template <typename T>
502502
inline std::shared_ptr<T> kernel::get_device(const std::string& dev_name) {
503+
std::unique_lock<std::recursive_mutex> lock(device_map_mtx);
504+
503505
if (device_map.find(dev_name) == device_map.end())
504506
throw std::runtime_error(robotkernel::helpers::string_printf(
505507
"device %s not found\n", dev_name.c_str()));

0 commit comments

Comments
 (0)