Fix race around destruction and accessing member variables

The callbacks run from a different thread, so there was a possible race
between the destruction of this class and access to member vars, like
this one:

WARNING: ThreadSanitizer: data race (pid=47443)
  Write of size 8 at 0x7b4800006f48 by main thread:
    #0 operator delete(void*, unsigned long) <null> (test-sysrepo_system-network+0x529088)
    #1 std::unique_ptr<std::filesystem::__cxx11::path::_List::_Impl, std::filesystem::__cxx11::path::_List::_Impl_deleter>::~unique_ptr() /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/unique_ptr.h:361:4 (test-sysrepo_system-network+0x544e56)
    #2 std::filesystem::__cxx11::path::_List::~_List() /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/fs_path.h:614:24 (test-sysrepo_system-network+0x544b48)
    #3 std::filesystem::__cxx11::path::~path() /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/fs_path.h:251:21 (test-sysrepo_system-network+0x53d189)
    #4 velia::system::Network::~Network() /home/ci/src/cesnet-gerrit-public/CzechLight/velia/src/system/Network.h:15:7 (test-sysrepo_system-network+0x5524db)
    #5 void __gnu_cxx::new_allocator<velia::system::Network>::destroy<velia::system::Network>(velia::system::Network*) /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/ext/new_allocator.h:156:10 (test-sysrepo_system-network+0x552484)
    #6 void std::allocator_traits<std::allocator<velia::system::Network> >::destroy<velia::system::Network>(std::allocator<velia::system::Network>&, velia::system::Network*) /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/alloc_traits.h:531:8 (test-sysrepo_system-network+0x5523eb)
    #7 std::_Sp_counted_ptr_inplace<velia::system::Network, std::allocator<velia::system::Network>, (__gnu_cxx::_Lock_policy)2>::_M_dispose() /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/shared_ptr_base.h:560:2 (test-sysrepo_system-network+0x550172)
    #8 std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/shared_ptr_base.h:158:6 (test-sysrepo_system-network+0x539f50)
    #9 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count() /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/shared_ptr_base.h:733:11 (test-sysrepo_system-network+0x539e18)
    #10 std::__shared_ptr<velia::system::Network, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr() /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/shared_ptr_base.h:1183:31 (test-sysrepo_system-network+0x552e52)
    #11 std::shared_ptr<velia::system::Network>::~shared_ptr() /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/shared_ptr.h:121:11 (test-sysrepo_system-network+0x53db5b)
    #12 _DOCTEST_ANON_FUNC_4() /home/ci/src/cesnet-gerrit-public/CzechLight/velia/tests/sysrepo_system-network.cpp:203:5 (test-sysrepo_system-network+0x530e17)
    #13 doctest::Context::run() /home/ci/target/include/doctest/doctest.h:5907:21 (test-sysrepo_system-network+0x56ca91)
    #14 main /home/ci/target/include/doctest/doctest.h:5991:71 (test-sysrepo_system-network+0x56e58d)

  Previous read of size 1 at 0x7b4800006f4b by thread T9:
    #0 memcpy <null> (test-sysrepo_system-network+0x4e6266)
    #1 <null> /usr/src/debug/gcc-10.2.1-6.fc33.x86_64/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/char_traits.h:395:49 (libstdc++.so.6+0x168625)
    #2 <null> /usr/src/debug/gcc-10.2.1-6.fc33.x86_64/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/basic_string.h:351:21 (libstdc++.so.6+0x168625)
    #3 <null> /usr/src/debug/gcc-10.2.1-6.fc33.x86_64/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/basic_string.h:346:7 (libstdc++.so.6+0x168625)
    #4 <null> /usr/src/debug/gcc-10.2.1-6.fc33.x86_64/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/basic_string.h:393:16 (libstdc++.so.6+0x168625)
    #5 <null> /usr/src/debug/gcc-10.2.1-6.fc33.x86_64/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/basic_string.tcc:225:25 (libstdc++.so.6+0x168625)
    #6 <null> /usr/src/debug/gcc-10.2.1-6.fc33.x86_64/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/basic_string.h:247:23 (libstdc++.so.6+0x168625)
    #7 <null> /usr/src/debug/gcc-10.2.1-6.fc33.x86_64/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/basic_string.h:266:20 (libstdc++.so.6+0x168625)
    #8 <null> /usr/src/debug/gcc-10.2.1-6.fc33.x86_64/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/basic_string.h:451:21 (libstdc++.so.6+0x168625)
    #9 std::filesystem::__cxx11::path::path(std::filesystem::__cxx11::path const&) /usr/src/debug/gcc-10.2.1-6.fc33.x86_64/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/fs_path.h:208:5 (libstdc++.so.6+0x168625)
    #10 std::filesystem::__cxx11::path::_Cmpt::_Cmpt(std::filesystem::__cxx11::path::_Cmpt const&) /usr/src/debug/gcc-10.2.1-6.fc33.x86_64/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/fs_path.h:767:16 (libstdc++.so.6+0x168625)
    #11 void std::_Construct<std::filesystem::__cxx11::path::_Cmpt, std::filesystem::__cxx11::path::_Cmpt const&>(std::filesystem::__cxx11::path::_Cmpt*, std::filesystem::__cxx11::path::_Cmpt const&) /usr/src/debug/gcc-10.2.1-6.fc33.x86_64/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/stl_construct.h:109:7 (libstdc++.so.6+0x168625)
    #12 std::filesystem::__cxx11::path::_Cmpt* std::__uninitialized_copy<false>::__uninit_copy<std::filesystem::__cxx11::path::_Cmpt const*, std::filesystem::__cxx11::path::_Cmpt*>(std::filesystem::__cxx11::path::_Cmpt const*, std::filesystem::__cxx11::path::_Cmpt const*, std::filesystem::__cxx11::path::_Cmpt*) /usr/src/debug/gcc-10.2.1-6.fc33.x86_64/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/stl_uninitialized.h:91:18 (libstdc++.so.6+0x168625)
    #13 std::filesystem::__cxx11::path::_Cmpt* std::uninitialized_copy<std::filesystem::__cxx11::path::_Cmpt const*, std::filesystem::__cxx11::path::_Cmpt*>(std::filesystem::__cxx11::path::_Cmpt const*, std::filesystem::__cxx11::path::_Cmpt const*, std::filesystem::__cxx11::path::_Cmpt*) /usr/src/debug/gcc-10.2.1-6.fc33.x86_64/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/stl_uninitialized.h:150:15 (libstdc++.so.6+0x168625)
    #14 std::filesystem::__cxx11::path::_Cmpt* std::__uninitialized_copy_n<std::filesystem::__cxx11::path::_Cmpt const*, int, std::filesystem::__cxx11::path::_Cmpt*>(std::filesystem::__cxx11::path::_Cmpt const*, int, std::filesystem::__cxx11::path::_Cmpt*, std::random_access_iterator_tag) /usr/src/debug/gcc-10.2.1-6.fc33.x86_64/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/stl_uninitialized.h:807:37 (libstdc++.so.6+0x168625)
    #15 std::filesystem::__cxx11::path::_Cmpt* std::uninitialized_copy_n<std::filesystem::__cxx11::path::_Cmpt const*, int, std::filesystem::__cxx11::path::_Cmpt*>(std::filesystem::__cxx11::path::_Cmpt const*, int, std::filesystem::__cxx11::path::_Cmpt*) /usr/src/debug/gcc-10.2.1-6.fc33.x86_64/obj-x86_64-redhat-linux/x86_64-redhat-linux/libstdc++-v3/include/bits/stl_uninitialized.h:856:41 (libstdc++.so.6+0x168625)
    #16 std::filesystem::__cxx11::path::_List::_Impl::copy() const ../../../../../libstdc++-v3/src/c++17/fs_path.cc:236:30 (libstdc++.so.6+0x168625)
    #17 std::filesystem::__cxx11::operator/(std::filesystem::__cxx11::path const&, std::filesystem::__cxx11::path const&) /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/fs_path.h:492:12 (test-sysrepo_system-network+0x53cdee)
    #18 velia::system::Network::generateConfig(std::shared_ptr<sysrepo::Session>) /home/ci/src/cesnet-gerrit-public/CzechLight/velia/src/system/Network.cpp:70:43 (test-sysrepo_system-network+0x5a0689)
    #19 auto velia::system::Network::Network(std::shared_ptr<sysrepo::Session>, std::filesystem::__cxx11::path, std::function<void (std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)>)::$_0::operator()<std::shared_ptr<sysrepo::Session>, char const*, char const*, sr_event_e, unsigned int>(std::shared_ptr<sysrepo::Session>, char const*, char const*, sr_event_e, unsigned int) const /home/ci/src/cesnet-gerrit-public/CzechLight/velia/src/system/Network.cpp:57:20 (test-sysrepo_system-network+0x5a1aa2)
    #20 int std::__invoke_impl<int, velia::system::Network::Network(std::shared_ptr<sysrepo::Session>, std::filesystem::__cxx11::path, std::function<void (std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)>)::$_0&, std::shared_ptr<sysrepo::Session>, char const*, char const*, sr_event_e, unsigned int>(std::__invoke_other, velia::system::Network::Network(std::shared_ptr<sysrepo::Session>, std::filesystem::__cxx11::path, std::function<void (std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)>)::$_0&, std::shared_ptr<sysrepo::Session>&&, char const*&&, char const*&&, sr_event_e&&, unsigned int&&) /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/invoke.h:60:14 (test-sysrepo_system-network+0x5a1978)
    #21 std::enable_if<is_invocable_r_v<int, velia::system::Network::Network(std::shared_ptr<sysrepo::Session>, std::filesystem::__cxx11::path, std::function<void (std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)>)::$_0&, std::shared_ptr<sysrepo::Session>, char const*, char const*, sr_event_e, unsigned int>, int>::type std::__invoke_r<int, velia::system::Network::Network(std::shared_ptr<sysrepo::Session>, std::filesystem::__cxx11::path, std::function<void (std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)>)::$_0&, std::shared_ptr<sysrepo::Session>, char const*, char const*, sr_event_e, unsigned int>(velia::system::Network::Network(std::shared_ptr<sysrepo::Session>, std::filesystem::__cxx11::path, std::function<void (std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)>)::$_0&, std::shared_ptr<sysrepo::Session>&&, char const*&&, char const*&&, sr_event_e&&, unsigned int&&) /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/invoke.h:113:9 (test-sysrepo_system-network+0x5a1770)
    #22 std::_Function_handler<int (std::shared_ptr<sysrepo::Session>, char const*, char const*, sr_event_e, unsigned int), velia::system::Network::Network(std::shared_ptr<sysrepo::Session>, std::filesystem::__cxx11::path, std::function<void (std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)>)::$_0>::_M_invoke(std::_Any_data const&, std::shared_ptr<sysrepo::Session>&&, char const*&&, char const*&&, sr_event_e&&, unsigned int&&) /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/std_function.h:291:9 (test-sysrepo_system-network+0x5a14df)
    #23 std::function<int (std::shared_ptr<sysrepo::Session>, char const*, char const*, sr_event_e, unsigned int)>::operator()(std::shared_ptr<sysrepo::Session>, char const*, char const*, sr_event_e, unsigned int) const /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/std_function.h:622:14 (libsysrepo-cpp.so.5+0x4f316)
    #24 sysrepo::Subscribe::module_change_subscribe(char const*, std::function<int (std::shared_ptr<sysrepo::Session>, char const*, char const*, sr_event_e, unsigned int)>, char const*, unsigned int, unsigned int)::$_1::operator()(sr_session_ctx_s*, char const*, char const*, sr_event_e, unsigned int, void*) const /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/sysrepo/bindings/cpp/src/Session.cpp:500:24 (libsysrepo-cpp.so.5+0x48294)
    #25 sysrepo::Subscribe::module_change_subscribe(char const*, std::function<int (std::shared_ptr<sysrepo::Session>, char const*, char const*, sr_event_e, unsigned int)>, char const*, unsigned int, unsigned int)::$_1::__invoke(sr_session_ctx_s*, char const*, char const*, sr_event_e, unsigned int, void*) /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/sysrepo/bindings/cpp/src/Session.cpp:491:13 (libsysrepo-cpp.so.5+0x48182)
    #26 sr_shmsub_change_listen_process_module_events /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/sysrepo/src/shm_sub.c:2370:19 (libsysrepo.so.5+0x9bd37)
    #27 sr_process_events /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/sysrepo/src/sysrepo.c:2712:25 (libsysrepo.so.5+0x14fdc)
    #28 sr_shmsub_listen_thread /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/sysrepo/src/shm_sub.c:3467:15 (libsysrepo.so.5+0xa3ed3)

  Thread T9 (tid=47453, running) created by main thread at:
    #0 pthread_create <null> (test-sysrepo_system-network+0x4e31cd)
    #1 sr_subs_new /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/sysrepo/src/sysrepo.c:3000:15 (libsysrepo.so.5+0x1757c)
    #2 sr_module_change_subscribe /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/sysrepo/src/sysrepo.c:3081:25 (libsysrepo.so.5+0x15c9d)
    #3 sysrepo::Subscribe::module_change_subscribe(char const*, std::function<int (std::shared_ptr<sysrepo::Session>, char const*, char const*, sr_event_e, unsigned int)>, char const*, unsigned int, unsigned int) /home/ci/src/cesnet-gerrit-public/CzechLight/dependencies/sysrepo/bindings/cpp/src/Session.cpp:487:15 (libsysrepo-cpp.so.5+0x4761f)
    #4 velia::system::Network::Network(std::shared_ptr<sysrepo::Session>, std::filesystem::__cxx11::path, std::function<void (std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)>) /home/ci/src/cesnet-gerrit-public/CzechLight/velia/src/system/Network.cpp:54:20 (test-sysrepo_system-network+0x5a0347)
    #5 void __gnu_cxx::new_allocator<velia::system::Network>::construct<velia::system::Network, std::shared_ptr<sysrepo::Session>&, std::filesystem::__cxx11::path&, _DOCTEST_ANON_FUNC_4()::$_4>(velia::system::Network*, std::shared_ptr<sysrepo::Session>&, std::filesystem::__cxx11::path&, _DOCTEST_ANON_FUNC_4()::$_4&&) /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/ext/new_allocator.h:150:23 (test-sysrepo_system-network+0x536ba9)
    #6 void std::allocator_traits<std::allocator<velia::system::Network> >::construct<velia::system::Network, std::shared_ptr<sysrepo::Session>&, std::filesystem::__cxx11::path&, _DOCTEST_ANON_FUNC_4()::$_4>(std::allocator<velia::system::Network>&, velia::system::Network*, std::shared_ptr<sysrepo::Session>&, std::filesystem::__cxx11::path&, _DOCTEST_ANON_FUNC_4()::$_4&&) /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/alloc_traits.h:512:8 (test-sysrepo_system-network+0x536a90)
    #7 std::_Sp_counted_ptr_inplace<velia::system::Network, std::allocator<velia::system::Network>, (__gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<std::shared_ptr<sysrepo::Session>&, std::filesystem::__cxx11::path&, _DOCTEST_ANON_FUNC_4()::$_4>(std::allocator<velia::system::Network>, std::shared_ptr<sysrepo::Session>&, std::filesystem::__cxx11::path&, _DOCTEST_ANON_FUNC_4()::$_4&&) /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/shared_ptr_base.h:551:4 (test-sysrepo_system-network+0x536996)
    #8 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::__shared_count<velia::system::Network, std::allocator<velia::system::Network>, std::shared_ptr<sysrepo::Session>&, std::filesystem::__cxx11::path&, _DOCTEST_ANON_FUNC_4()::$_4>(velia::system::Network*&, std::_Sp_alloc_shared_tag<std::allocator<velia::system::Network> >, std::shared_ptr<sysrepo::Session>&, std::filesystem::__cxx11::path&, _DOCTEST_ANON_FUNC_4()::$_4&&) /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/shared_ptr_base.h:683:6 (test-sysrepo_system-network+0x53678c)
    #9 std::__shared_ptr<velia::system::Network, (__gnu_cxx::_Lock_policy)2>::__shared_ptr<std::allocator<velia::system::Network>, std::shared_ptr<sysrepo::Session>&, std::filesystem::__cxx11::path&, _DOCTEST_ANON_FUNC_4()::$_4>(std::_Sp_alloc_shared_tag<std::allocator<velia::system::Network> >, std::shared_ptr<sysrepo::Session>&, std::filesystem::__cxx11::path&, _DOCTEST_ANON_FUNC_4()::$_4&&) /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/shared_ptr_base.h:1371:14 (test-sysrepo_system-network+0x5365fa)
    #10 std::shared_ptr<velia::system::Network>::shared_ptr<std::allocator<velia::system::Network>, std::shared_ptr<sysrepo::Session>&, std::filesystem::__cxx11::path&, _DOCTEST_ANON_FUNC_4()::$_4>(std::_Sp_alloc_shared_tag<std::allocator<velia::system::Network> >, std::shared_ptr<sysrepo::Session>&, std::filesystem::__cxx11::path&, _DOCTEST_ANON_FUNC_4()::$_4&&) /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/shared_ptr.h:408:4 (test-sysrepo_system-network+0x5364fe)
    #11 std::shared_ptr<velia::system::Network> std::allocate_shared<velia::system::Network, std::allocator<velia::system::Network>, std::shared_ptr<sysrepo::Session>&, std::filesystem::__cxx11::path&, _DOCTEST_ANON_FUNC_4()::$_4>(std::allocator<velia::system::Network> const&, std::shared_ptr<sysrepo::Session>&, std::filesystem::__cxx11::path&, _DOCTEST_ANON_FUNC_4()::$_4&&) /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/shared_ptr.h:859:14 (test-sysrepo_system-network+0x5363dc)
    #12 std::shared_ptr<velia::system::Network> std::make_shared<velia::system::Network, std::shared_ptr<sysrepo::Session>&, std::filesystem::__cxx11::path&, _DOCTEST_ANON_FUNC_4()::$_4>(std::shared_ptr<sysrepo::Session>&, std::filesystem::__cxx11::path&, _DOCTEST_ANON_FUNC_4()::$_4&&) /usr/lib/gcc/x86_64-redhat-linux/10/../../../../include/c++/10/bits/shared_ptr.h:875:14 (test-sysrepo_system-network+0x531965)
    #13 _DOCTEST_ANON_FUNC_4() /home/ci/src/cesnet-gerrit-public/CzechLight/velia/tests/sysrepo_system-network.cpp:184:24 (test-sysrepo_system-network+0x5304d6)
    #14 doctest::Context::run() /home/ci/target/include/doctest/doctest.h:5907:21 (test-sysrepo_system-network+0x56ca91)
    #15 main /home/ci/target/include/doctest/doctest.h:5991:71 (test-sysrepo_system-network+0x56e58d)

SUMMARY: ThreadSanitizer: data race (/home/ci/build/test-sysrepo_system-network+0x529088) in operator delete(void*, unsigned long)

Previously, this was masked by an overly broad TSAN suppression file for
sysrepo; everything which went through the callbacks was essentially
getting a free pass. Now that we have no suppressions for sysrepo, it's
immediately visible.

Fix this by making sure that the subscription gets destroyed before the
other member variables. While this was not a problem for the test suite
(there was certainly no use-after-free, we would have noticed that), the
code *was* wrong because it allowed for a potential use-after-free, and
TSAN helped uncover this. Now that the subscription wrapper is destroyed
before the other members, this use-after-free is prevented, *and*
because the subscriber is managed via a shared_ptr which was an implicit
atomic operation, this also takes care of the data race that TSAN
flagged in the first place. Neat, I think.

Change-Id: I5778101d5243c9285d952e5f20eccfb92fa288df
2 files changed
tree: 3a2d25ed8b2d145f4c5e6ffdbad467f031f0bcf0
  1. .clang-format
  2. .gitmodules
  3. .zuul.CzechLight-internal.yaml
  4. .zuul.public.yaml
  5. CMakeLists.txt
  6. Doxyfile.in
  7. LICENSE
  8. LICENSE.md
  9. README.md
  10. ci/
  11. cmake/
  12. docs/
  13. src/
  14. tests/
  15. yang/
README.md

YANG System management for embedded devices running Linux

Together with sysrepo, this software provides "general system management" of embedded devices. The target platform is anything that runs Linux with systemd. This runs in production on CzechLight SDN DWDM devices.

Health tracking

This component tracks the overal health state of the system, including various sensors, or the state of systemd units. As an operator-friendly LED at the front panel of the appliance shows the aggregated health state.

System management

Firmware can be updated via RAUC, and various aspects of the system's configuration can be adjusted. This includes a firewall, basic network settings, and authentication management.

Supported YANG models

For a full list, consult the yang/ directory in this repository.