commit | 563b01f2ec8cd64187f1d6e048827678a7e34944 | [log] [tgz] |
---|---|---|
author | Jan Kundrát <jan.kundrat@cesnet.cz> | Fri Apr 16 14:42:56 2021 +0200 |
committer | Jan Kundrát <jan.kundrat@cesnet.cz> | Fri Apr 16 14:42:56 2021 +0200 |
tree | 3a2d25ed8b2d145f4c5e6ffdbad467f031f0bcf0 | |
parent | 3611c0ed288120f3128b620cc471dcd5063f5a78 [diff] |
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
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.
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.
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.
For a full list, consult the yang/
directory in this repository.