diff options
author | Martin Braun <martin.braun@ettus.com> | 2019-09-11 19:47:21 -0700 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2019-11-26 11:49:44 -0800 |
commit | 2d40c33b15ee91fdf5f0f7ca6987fe7dbf18205a (patch) | |
tree | a8e132fa124c2fe163eec5d7adfaa8d8e698d446 /host/lib/rfnoc | |
parent | b59b9ed3a7f62d2a6d7933a18b11b0b29c33c689 (diff) | |
download | uhd-2d40c33b15ee91fdf5f0f7ca6987fe7dbf18205a.tar.gz uhd-2d40c33b15ee91fdf5f0f7ca6987fe7dbf18205a.tar.bz2 uhd-2d40c33b15ee91fdf5f0f7ca6987fe7dbf18205a.zip |
rfnoc: rfnoc_graph: Safely deinit full graph on any kind of init error
In the rfnoc_graph, we init blocks, GSM, motherboard controllers, and
other things. Since any of these can potentially throw exceptions, we
make sure to deinit those components that have already initialized
properly before exiting.
Diffstat (limited to 'host/lib/rfnoc')
-rw-r--r-- | host/lib/rfnoc/rfnoc_graph.cpp | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/host/lib/rfnoc/rfnoc_graph.cpp b/host/lib/rfnoc/rfnoc_graph.cpp index 60afbdad5..a6ec59d01 100644 --- a/host/lib/rfnoc/rfnoc_graph.cpp +++ b/host/lib/rfnoc/rfnoc_graph.cpp @@ -54,24 +54,24 @@ public: // Now initialize all subsystems: _init_mb_controllers(); _init_gsm(); // Graph Stream Manager - for (size_t mb_idx = 0; mb_idx < _num_mboards; ++mb_idx) { - try { - // If anything fails here, we immediately deinit all the other - // blocks to avoid any more fallout, then safely bring down the - // device. + try { + // If anything fails here, we immediately deinit all the other + // blocks to avoid any more fallout, then safely bring down the + // device. + for (size_t mb_idx = 0; mb_idx < _num_mboards; ++mb_idx) { _init_blocks(mb_idx, dev_addr); - } catch (...) { - _block_registry->shutdown(); - throw; } + UHD_LOG_TRACE(LOG_ID, "Initializing properties on all blocks..."); + _block_registry->init_props(); + _init_sep_map(); + _init_static_connections(); + _init_mbc(); + // Start with time set to zero, but don't complain if sync fails + rfnoc_graph_impl::synchronize_devices(uhd::time_spec_t(0.0), true); + } catch (...) { + _block_registry->shutdown(); + throw; } - UHD_LOG_TRACE(LOG_ID, "Initializing properties on all blocks..."); - _block_registry->init_props(); - _init_sep_map(); - _init_static_connections(); - _init_mbc(); - // Start with time set to zero, but don't complain if sync fails - rfnoc_graph_impl::synchronize_devices(uhd::time_spec_t(0.0), true); } catch (const std::exception& ex) { UHD_LOG_ERROR(LOG_ID, "Caught exception while initializing graph: " << ex.what()); throw uhd::runtime_error("Failure to create rfnoc_graph."); |