struct Registry::Manager { // map storing the functions. // We delibrately used raw pointer // This is because PackedFunc can contain callbacks into the host languge(python) // and the resource can become invalid because of indeterminstic order of destruction. // The resources will only be recycled during program exit. std::unordered_map<std::string, Registry*> fmap; // vtable for extension type std::array<ExtTypeVTable, kExtEnd> ext_vtable; // mutex std::mutex mutex; Manager() { for (auto& x : ext_vtable) { x.destroy = nullptr; } } static Manager* Global() { // We deliberately leak the Manager instance, to avoid leak sanitizers // complaining about the entries in Manager::fmap being leaked at program // exit. static Manager* inst = new Manager(); return inst; } };
第一个