diff --git a/mindspore/lite/src/kernel_registry.cc b/mindspore/lite/src/kernel_registry.cc index 5e536c9b00..3a964e45c4 100644 --- a/mindspore/lite/src/kernel_registry.cc +++ b/mindspore/lite/src/kernel_registry.cc @@ -31,6 +31,14 @@ using mindspore::kernel::KernelKey; namespace mindspore::lite { KernelRegistry *KernelRegistry::GetInstance() { static KernelRegistry instance; + + std::unique_lock malloc_creator_array(instance.lock_); + if (instance.creator_arrays_ == nullptr) { + instance.creator_arrays_ = reinterpret_cast(malloc(array_size_ * sizeof(KernelRegistry))); + if (instance.creator_arrays_ == nullptr) { + return nullptr; + } + } return &instance; } @@ -127,5 +135,12 @@ kernel::LiteKernel *KernelRegistry::GetKernel(const std::vector &in_te return nullptr; } -KernelRegistry::~KernelRegistry() = default; +KernelRegistry::~KernelRegistry() { + KernelRegistry *instance = GetInstance(); + std::unique_lock malloc_creator_array(instance->lock_); + if (instance->creator_arrays_ != nullptr) { + free(instance->creator_arrays_); + instance->creator_arrays_ = nullptr; + } +} } // namespace mindspore::lite diff --git a/mindspore/lite/src/kernel_registry.h b/mindspore/lite/src/kernel_registry.h index 508da3762d..77922c4c35 100644 --- a/mindspore/lite/src/kernel_registry.h +++ b/mindspore/lite/src/kernel_registry.h @@ -50,7 +50,10 @@ class KernelRegistry { static const int data_type_length_{kNumberTypeEnd - kNumberTypeBegin + 1}; static const int op_type_length_{PrimitiveType_MAX - PrimitiveType_MIN + 1}; static const int array_size_{device_type_length_ * data_type_length_ * op_type_length_}; - kernel::KernelCreator creator_arrays_[array_size_] = {nullptr}; + kernel::KernelCreator *creator_arrays_ = nullptr; + + private: + std::mutex lock_; }; class KernelRegistrar {