From ed4a7a3842c7f7c5f53fee139061b162350cfe28 Mon Sep 17 00:00:00 2001 From: Vitaliy Urusovskij Date: Wed, 26 Apr 2023 15:40:12 +0400 Subject: [PATCH] [2022.3] Fix TSAN issues in GNA plugin (#17216) * Fix TSAN issue in GNA plugin (#17163) * Fix TSAN issue No2 in GNA plugin (#17185) * Fix TSAN issue No2 in GNA plugin * Misprint * Add copyright --- ...executable_network_thread_safe_default.hpp | 2 +- .../intel_gna/src/gna_plugin_internal.hpp | 20 +++++++++++-------- src/plugins/intel_gna/src/log/log.cpp | 11 ++++++++++ src/plugins/intel_gna/src/log/log.hpp | 5 ++++- 4 files changed, 28 insertions(+), 10 deletions(-) create mode 100644 src/plugins/intel_gna/src/log/log.cpp diff --git a/src/inference/dev_api/cpp_interfaces/impl/ie_executable_network_thread_safe_default.hpp b/src/inference/dev_api/cpp_interfaces/impl/ie_executable_network_thread_safe_default.hpp index 48c67f3930a..6a097f8004f 100644 --- a/src/inference/dev_api/cpp_interfaces/impl/ie_executable_network_thread_safe_default.hpp +++ b/src/inference/dev_api/cpp_interfaces/impl/ie_executable_network_thread_safe_default.hpp @@ -18,7 +18,7 @@ namespace InferenceEngine { /** * @brief This class provides optimal thread safe default implementation. - * The class is recommended to be used as a base class for Executable Network impleentation during plugin development. + * The class is recommended to be used as a base class for Executable Network implementation during plugin development. * @ingroup ie_dev_api_exec_network_api */ class ExecutableNetworkThreadSafeDefault : public IExecutableNetworkInternal { diff --git a/src/plugins/intel_gna/src/gna_plugin_internal.hpp b/src/plugins/intel_gna/src/gna_plugin_internal.hpp index 78959d41d17..c5a0ca2d388 100644 --- a/src/plugins/intel_gna/src/gna_plugin_internal.hpp +++ b/src/plugins/intel_gna/src/gna_plugin_internal.hpp @@ -17,10 +17,11 @@ namespace GNAPluginNS { class GNAPluginInternal : public InferenceEngine::IInferencePlugin { private: - std::mutex syncCallsToLoadExeNetworkImpl; + mutable std::mutex syncCalls; Config defaultConfig; std::weak_ptr plgPtr; std::shared_ptr GetCurrentPlugin() const { + std::lock_guard lock{syncCalls}; auto ptr = plgPtr.lock(); if (ptr == nullptr) { return std::make_shared(); @@ -34,9 +35,9 @@ protected: public: InferenceEngine::IExecutableNetworkInternal::Ptr LoadExeNetworkImpl( - const InferenceEngine::CNNNetwork &network, - const std::map &config) override { - std::lock_guard lock{ syncCallsToLoadExeNetworkImpl }; + const InferenceEngine::CNNNetwork& network, + const std::map& config) override { + std::lock_guard lock{syncCalls}; Config updated_config(defaultConfig); updated_config.UpdateFromMap(config); auto plg = std::make_shared(updated_config.keyConfigMap); @@ -50,8 +51,9 @@ public: } InferenceEngine::IExecutableNetworkInternal::Ptr ImportNetwork( - const std::string &modelFileName, - const std::map &config) override { + const std::string& modelFileName, + const std::map& config) override { + std::lock_guard lock{syncCalls}; Config updated_config(defaultConfig); updated_config.UpdateFromMap(config); auto plg = std::make_shared(updated_config.keyConfigMap); @@ -63,8 +65,10 @@ public: return network_impl; } - InferenceEngine::IExecutableNetworkInternal::Ptr ImportNetwork(std::istream& networkModel, - const std::map& config) override { + InferenceEngine::IExecutableNetworkInternal::Ptr ImportNetwork( + std::istream& networkModel, + const std::map& config) override { + std::lock_guard lock{syncCalls}; Config updated_config(defaultConfig); updated_config.UpdateFromMap(config); auto plg = std::make_shared(updated_config.keyConfigMap); diff --git a/src/plugins/intel_gna/src/log/log.cpp b/src/plugins/intel_gna/src/log/log.cpp new file mode 100644 index 00000000000..19ba8533958 --- /dev/null +++ b/src/plugins/intel_gna/src/log/log.cpp @@ -0,0 +1,11 @@ +// Copyright (C) 2023 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "log.hpp" + +namespace ov { +namespace intel_gna { +std::mutex GnaLog::mutex_; +} // namespace intel_gna +} // namespace ov diff --git a/src/plugins/intel_gna/src/log/log.hpp b/src/plugins/intel_gna/src/log/log.hpp index 7b9761857c3..fb179d0c64b 100644 --- a/src/plugins/intel_gna/src/log/log.hpp +++ b/src/plugins/intel_gna/src/log/log.hpp @@ -4,8 +4,9 @@ #pragma once -#include #include +#include +#include #include "openvino/runtime/properties.hpp" @@ -23,6 +24,7 @@ class GnaLog { GnaLog() = default; static GnaLog& log(ov::log::Level log_level) { + std::lock_guard guard(mutex_); GnaLog& obj = get_instance(); obj.message_level_ = log_level; obj << "[" << log_level << "]" << " "; @@ -34,6 +36,7 @@ class GnaLog { /** Log level of particular log message */ ov::log::Level message_level_ = ov::log::Level::NO; + static std::mutex mutex_; static GnaLog& get_instance() { static GnaLog log_obj;