GraphListener::GraphListener() : is_started_(false), is_shutdown_(false), shutdown_guard_condition_(nullptr) { rcl_ret_t ret = rcl_guard_condition_init( &interrupt_guard_condition_, rcl_guard_condition_get_default_options()); if (RCL_RET_OK != ret) { throw_from_rcl_error(ret, "failed to create interrupt guard condition"); } shutdown_guard_condition_ = rclcpp::utilities::get_sigint_guard_condition(&wait_set_); }
rcl_guard_condition_t * rclcpp::utilities::get_sigint_guard_condition(rcl_wait_set_t * waitset) { std::lock_guard<std::mutex> lock(g_sigint_guard_cond_handles_mutex); auto kv = g_sigint_guard_cond_handles.find(waitset); if (kv != g_sigint_guard_cond_handles.end()) { return &kv->second; } else { rcl_guard_condition_t handle = rcl_get_zero_initialized_guard_condition(); rcl_guard_condition_options_t options = rcl_guard_condition_get_default_options(); if (rcl_guard_condition_init(&handle, options) != RCL_RET_OK) { // *INDENT-OFF* (prevent uncrustify from making unnecessary indents here) throw std::runtime_error(std::string( "Couldn't initialize guard condition: ") + rcl_get_error_string_safe()); // *INDENT-ON* } g_sigint_guard_cond_handles[waitset] = handle; return &g_sigint_guard_cond_handles[waitset]; } }