|
19 | 19 | #include <sstream>
|
20 | 20 | #include <string>
|
21 | 21 | #include <vector>
|
| 22 | +#include <unordered_set> |
22 | 23 | #include <utility>
|
23 | 24 |
|
24 | 25 | #include "rcl/init.h"
|
@@ -307,6 +308,15 @@ Context::shutdown(const std::string & reason)
|
307 | 308 | // if it is not valid, then it cannot be shutdown
|
308 | 309 | return false;
|
309 | 310 | }
|
| 311 | + |
| 312 | + // call each pre-shutdown callback |
| 313 | + { |
| 314 | + std::lock_guard<std::mutex> lock{pre_shutdown_callbacks_mutex_}; |
| 315 | + for (const auto & callback : pre_shutdown_callbacks_) { |
| 316 | + (*callback)(); |
| 317 | + } |
| 318 | + } |
| 319 | + |
310 | 320 | // rcl shutdown
|
311 | 321 | rcl_ret_t ret = rcl_shutdown(rcl_context_.get());
|
312 | 322 | if (RCL_RET_OK != ret) {
|
@@ -355,36 +365,118 @@ Context::on_shutdown(OnShutdownCallback callback)
|
355 | 365 | rclcpp::OnShutdownCallbackHandle
|
356 | 366 | Context::add_on_shutdown_callback(OnShutdownCallback callback)
|
357 | 367 | {
|
358 |
| - auto callback_shared_ptr = std::make_shared<OnShutdownCallback>(callback); |
359 |
| - { |
360 |
| - std::lock_guard<std::mutex> lock(on_shutdown_callbacks_mutex_); |
361 |
| - on_shutdown_callbacks_.emplace(callback_shared_ptr); |
| 368 | + return add_shutdown_callback(ShutdownType::on_shutdown, callback); |
| 369 | +} |
| 370 | + |
| 371 | +bool |
| 372 | +Context::remove_on_shutdown_callback(const OnShutdownCallbackHandle & callback_handle) |
| 373 | +{ |
| 374 | + return remove_shutdown_callback(ShutdownType::on_shutdown, callback_handle); |
| 375 | +} |
| 376 | + |
| 377 | +rclcpp::PreShutdownCallbackHandle |
| 378 | +Context::add_pre_shutdown_callback(PreShutdownCallback callback) |
| 379 | +{ |
| 380 | + return add_shutdown_callback(ShutdownType::pre_shutdown, callback); |
| 381 | +} |
| 382 | + |
| 383 | +bool |
| 384 | +Context::remove_pre_shutdown_callback( |
| 385 | + const PreShutdownCallbackHandle & callback_handle) |
| 386 | +{ |
| 387 | + return remove_shutdown_callback(ShutdownType::pre_shutdown, callback_handle); |
| 388 | +} |
| 389 | + |
| 390 | +rclcpp::ShutdownCallbackHandle |
| 391 | +Context::add_shutdown_callback( |
| 392 | + ShutdownType shutdown_type, |
| 393 | + ShutdownCallback callback) |
| 394 | +{ |
| 395 | + auto callback_shared_ptr = |
| 396 | + std::make_shared<ShutdownCallbackHandle::ShutdownCallbackType>(callback); |
| 397 | + |
| 398 | + switch (shutdown_type) { |
| 399 | + case ShutdownType::pre_shutdown: |
| 400 | + { |
| 401 | + std::lock_guard<std::mutex> lock(pre_shutdown_callbacks_mutex_); |
| 402 | + pre_shutdown_callbacks_.emplace(callback_shared_ptr); |
| 403 | + } |
| 404 | + break; |
| 405 | + case ShutdownType::on_shutdown: |
| 406 | + { |
| 407 | + std::lock_guard<std::mutex> lock(on_shutdown_callbacks_mutex_); |
| 408 | + on_shutdown_callbacks_.emplace(callback_shared_ptr); |
| 409 | + } |
| 410 | + break; |
362 | 411 | }
|
363 | 412 |
|
364 |
| - OnShutdownCallbackHandle callback_handle; |
| 413 | + ShutdownCallbackHandle callback_handle; |
365 | 414 | callback_handle.callback = callback_shared_ptr;
|
366 | 415 | return callback_handle;
|
367 | 416 | }
|
368 | 417 |
|
369 | 418 | bool
|
370 |
| -Context::remove_on_shutdown_callback(const OnShutdownCallbackHandle & callback_handle) |
| 419 | +Context::remove_shutdown_callback( |
| 420 | + ShutdownType shutdown_type, |
| 421 | + const ShutdownCallbackHandle & callback_handle) |
371 | 422 | {
|
372 |
| - std::lock_guard<std::mutex> lock(on_shutdown_callbacks_mutex_); |
| 423 | + std::mutex * mutex_ptr; |
| 424 | + std::unordered_set< |
| 425 | + std::shared_ptr<ShutdownCallbackHandle::ShutdownCallbackType>> * callback_list_ptr; |
| 426 | + |
| 427 | + switch (shutdown_type) { |
| 428 | + case ShutdownType::pre_shutdown: |
| 429 | + mutex_ptr = &pre_shutdown_callbacks_mutex_; |
| 430 | + callback_list_ptr = &pre_shutdown_callbacks_; |
| 431 | + break; |
| 432 | + case ShutdownType::on_shutdown: |
| 433 | + mutex_ptr = &on_shutdown_callbacks_mutex_; |
| 434 | + callback_list_ptr = &on_shutdown_callbacks_; |
| 435 | + break; |
| 436 | + } |
| 437 | + |
| 438 | + std::lock_guard<std::mutex> lock(*mutex_ptr); |
373 | 439 | auto callback_shared_ptr = callback_handle.callback.lock();
|
374 | 440 | if (callback_shared_ptr == nullptr) {
|
375 | 441 | return false;
|
376 | 442 | }
|
377 |
| - return on_shutdown_callbacks_.erase(callback_shared_ptr) == 1; |
| 443 | + return callback_list_ptr->erase(callback_shared_ptr) == 1; |
378 | 444 | }
|
379 | 445 |
|
380 | 446 | std::vector<rclcpp::Context::OnShutdownCallback>
|
381 | 447 | Context::get_on_shutdown_callbacks() const
|
382 | 448 | {
|
383 |
| - std::vector<OnShutdownCallback> callbacks; |
| 449 | + return get_shutdown_callback(ShutdownType::on_shutdown); |
| 450 | +} |
| 451 | + |
| 452 | +std::vector<rclcpp::Context::PreShutdownCallback> |
| 453 | +Context::get_pre_shutdown_callbacks() const |
| 454 | +{ |
| 455 | + return get_shutdown_callback(ShutdownType::pre_shutdown); |
| 456 | +} |
384 | 457 |
|
| 458 | +std::vector<rclcpp::Context::ShutdownCallback> |
| 459 | +Context::get_shutdown_callback(ShutdownType shutdown_type) const |
| 460 | +{ |
| 461 | + std::mutex * mutex_ptr; |
| 462 | + const std::unordered_set< |
| 463 | + std::shared_ptr<ShutdownCallbackHandle::ShutdownCallbackType>> * callback_list_ptr; |
| 464 | + |
| 465 | + switch (shutdown_type) { |
| 466 | + case ShutdownType::pre_shutdown: |
| 467 | + mutex_ptr = &pre_shutdown_callbacks_mutex_; |
| 468 | + callback_list_ptr = &pre_shutdown_callbacks_; |
| 469 | + break; |
| 470 | + case ShutdownType::on_shutdown: |
| 471 | + mutex_ptr = &on_shutdown_callbacks_mutex_; |
| 472 | + callback_list_ptr = &on_shutdown_callbacks_; |
| 473 | + break; |
| 474 | + } |
| 475 | + |
| 476 | + std::vector<rclcpp::Context::ShutdownCallback> callbacks; |
385 | 477 | {
|
386 |
| - std::lock_guard<std::mutex> lock(on_shutdown_callbacks_mutex_); |
387 |
| - for (auto & iter : on_shutdown_callbacks_) { |
| 478 | + std::lock_guard<std::mutex> lock(*mutex_ptr); |
| 479 | + for (auto & iter : *callback_list_ptr) { |
388 | 480 | callbacks.emplace_back(*iter);
|
389 | 481 | }
|
390 | 482 | }
|
|
0 commit comments