From d37d38f924d8fa23b71917e5c00bce3818e946b7 Mon Sep 17 00:00:00 2001 From: Szymon Jastrzebski Date: Thu, 28 Jun 2018 08:35:46 +0200 Subject: [PATCH] [Common] Adding guard to protect container of Instances* [Verification] TCT Application, Systeminfo, Filesystem 100% Change-Id: Ife71f69fc031d14c6bcb1ec694cd2be102ed7f75 Signed-off-by: Szymon Jastrzebski --- src/common/extension.cc | 22 ++++++++++++++++------ src/common/extension.h | 2 ++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/common/extension.cc b/src/common/extension.cc index 5e12aad4..9fc1547b 100644 --- a/src/common/extension.cc +++ b/src/common/extension.cc @@ -218,26 +218,36 @@ int32_t Extension::XW_Initialize(XW_Extension extension, XW_GetInterface get_int return XW_OK; } +std::mutex Instance::instances_mutex_; std::unordered_set Instance::all_instances_; Instance::Instance() : xw_instance_(0) { ScopeLogger(); - { all_instances_.insert(this); } + { + std::lock_guard lock{instances_mutex_}; + all_instances_.insert(this); + } } Instance::~Instance() { ScopeLogger(); - { all_instances_.erase(this); } + { + std::lock_guard lock{instances_mutex_}; + all_instances_.erase(this); + } Assert(xw_instance_ == 0); } void Instance::PostMessage(Instance* that, const char* msg) { ScopeLogger(); - if (that && all_instances_.end() != all_instances_.find(that)) { - that->PostMessage(msg); - } else { - LoggerE("Trying to post message to non-existing instance: [%p], ignoring", that); + if (nullptr != that) { + std::lock_guard lock{instances_mutex_}; + if (all_instances_.end() != all_instances_.find(that)) { + that->PostMessage(msg); + return; + } } + LoggerE("Trying to post message to non-existing instance: [%p], ignoring", that); } void Instance::PostMessage(const char* msg) { diff --git a/src/common/extension.h b/src/common/extension.h index 907d1df3..9bb16f40 100644 --- a/src/common/extension.h +++ b/src/common/extension.h @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -109,6 +110,7 @@ class Instance { private: friend class Extension; + static std::mutex instances_mutex_; static std::unordered_set all_instances_; XW_Instance xw_instance_; -- 2.34.1