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 | |
| 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.
| -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."); | 
