Skip to content

Commit bf99e9a

Browse files
committed
mem leak reported with TVM runtime
[Problem] In TVM Runtime code, we have a comment that indicates the manager instance and registry were deliberately leaked to enable interoperability with Python clients. This shows up as a leaked resource in C++ API clients. [Solution] Add a static guard to differentiate between C++ only clients Allocate via make_shared() Leak Report Before ``` 2020-09-13T23:39:23.200-07:00 ==3194==ERROR: LeakSanitizer: detected memory leaks 2020-09-13T23:39:23.200-07:00 2020-09-13T23:39:23.200-07:00 Indirect leak of 2560 byte(s) in 40 object(s) allocated from: 2020-09-13T23:39:23.200-07:00 #0 0x5979ed in operator new(unsigned long) (MYAPP/core_unit_tests+0x5979ed) 2020-09-13T23:39:23.200-07:00 neo-ai#1 0x7ff12a187a57 in tvm::runtime::Registry::Register(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool) (MYAPP/resnet18_v1/libdlr.so+0x72a57) 2020-09-13T23:39:23.200-07:00 2020-09-13T23:39:23.200-07:00 Indirect leak of 2240 byte(s) in 40 object(s) allocated from: 2020-09-13T23:39:23.200-07:00 #0 0x5979ed in operator new(unsigned long) (MYAPP/core_unit_tests+0x5979ed) 2020-09-13T23:39:23.200-07:00 neo-ai#1 0x7ff12a188c99 in std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, tvm::runtime::Registry*>, true>* std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, tvm::runtime::Registry*>, true> > >::_M_allocate_node<std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>, std::tuple<> >(std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>&&, std::tuple<>&&) (MYAPP/resnet18_v1/libdlr.so+0x73c99) 2020-09-13T23:39:23.200-07:00 2020-09-13T23:39:23.200-07:00 Indirect leak of 1116 byte(s) in 36 object(s) allocated from: 2020-09-13T23:39:23.200-07:00 #0 0x5979ed in operator new(unsigned long) (MYAPP/core_unit_tests+0x5979ed) 2020-09-13T23:39:23.200-07:00 neo-ai#1 0x7ff12d83cafe in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (/lib/x86_64-linux-gnu/libstdc++.so.6+0x142afe) 2020-09-13T23:39:23.200-07:00 2020-09-13T23:39:23.200-07:00 Indirect leak of 866 byte(s) in 36 object(s) allocated from: 2020-09-13T23:39:23.200-07:00 #0 0x5979ed in operator new(unsigned long) (MYAPP/core_unit_tests+0x5979ed) 2020-09-13T23:39:23.200-07:00 neo-ai#1 0x7ff12a188ce0 in std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, tvm::runtime::Registry*>, true>* std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, tvm::runtime::Registry*>, true> > >::_M_allocate_node<std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>, std::tuple<> >(std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>&&, std::tuple<>&&) (MYAPP//resnet18_v1/libdlr.so+0x73ce0) 2020-09-13T23:39:23.200-07:00 2020-09-13T23:39:23.200-07:00 Indirect leak of 464 byte(s) in 2 object(s) allocated from: 2020-09-13T23:39:23.200-07:00 #0 0x5979ed in operator new(unsigned long) (MYAPP/core_unit_tests+0x5979ed) 2020-09-13T23:39:23.200-07:00 neo-ai#1 0x7ff12a188e0a in std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, tvm::runtime::Registry*>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, tvm::runtime::Registry*> >, std::__detail::_Select1st, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::_M_insert_unique_node(unsigned long, unsigned long, std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, tvm::runtime::Registry*>, true>*, unsigned long) (MYAPP//resnet18_v1/libdlr.so+0x73e0a) 2020-09-13T23:39:23.200-07:00 2020-09-13T23:39:23.200-07:00 Indirect leak of 192 byte(s) in 2 object(s) allocated from: 2020-09-13T23:39:23.200-07:00 #0 0x5979ed in operator new(unsigned long) (MYAPP/core_unit_tests+0x5979ed) 2020-09-13T23:39:23.200-07:00 neo-ai#1 0x7ff12a187aca in tvm::runtime::Registry::Register(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool) (MYAPP//resnet18_v1/libdlr.so+0x72aca) 2020-09-13T23:39:23.200-07:00 2020-09-13T23:39:23.200-07:00 SUMMARY: AddressSanitizer: 7438 byte(s) leaked in 156 allocation(s). ```
1 parent 4cbdc40 commit bf99e9a

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

src/runtime/registry.cc

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,13 @@ struct Registry::Manager {
5151
// We deliberately leak the Manager instance, to avoid leak sanitizers
5252
// complaining about the entries in Manager::fmap being leaked at program
5353
// exit.
54+
#ifdef PYTHON_INTEROP_REGISTRY
5455
static Manager* inst = new Manager();
5556
return inst;
57+
#else
58+
std::shared_ptr<Manager> m_inst = std::make_shared<Manager>();
59+
return m_inst.get();
60+
#endif
5661
}
5762
};
5863

@@ -68,9 +73,15 @@ Registry& Registry::Register(const std::string& name, bool can_override) { // N
6873
CHECK(can_override) << "Global PackedFunc " << name << " is already registered";
6974
}
7075

71-
Registry* r = new Registry();
76+
Registry* r = nullptr;
77+
#ifdef PYTHON_INTEROP_REGISTRY
78+
r = new Registry();
7279
r->name_ = name;
7380
m->fmap[name] = r;
81+
#else
82+
std::shared_ptr<Registry> r_shared = std::make_shared<Registry>();
83+
r = r_shared.get();
84+
#endif
7485
return *r;
7586
}
7687

0 commit comments

Comments
 (0)