From: Szymon Jastrzebski Date: Thu, 28 Jun 2018 06:35:46 +0000 (+0200) Subject: [Common] Adding guard to protect container of Instances* X-Git-Tag: submit/tizen/20190109.233706^2~7 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F39%2F194439%2F1;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [Common] Adding guard to protect container of Instances* [Verification] TCT Application, Systeminfo, Filesystem 100% Change-Id: Ife71f69fc031d14c6bcb1ec694cd2be102ed7f75 Signed-off-by: Szymon Jastrzebski --- 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_;