};
auto launch_response = [this](const std::shared_ptr<picojson::value>& response) -> void {
- this->instance_.PostMessage(response->serialize().c_str());
+ Instance::PostMessage(&this->instance_, response->serialize().c_str());
};
TaskQueue::GetInstance().Queue<picojson::value>(launch, launch_response, response);
return XW_OK;
}
+std::mutex Instance::instance_mutex_;
+std::unordered_set<Instance*> Instance::all_instances_;
Instance::Instance() :
xw_instance_(0)
{
LoggerD("Enter");
+ {
+ std::lock_guard<std::mutex> lock(instance_mutex_);
+ all_instances_.insert(this);
+ }
}
Instance::~Instance() {
LoggerD("Enter");
+ {
+ std::lock_guard<std::mutex> lock(instance_mutex_);
+ all_instances_.erase(this);
+ }
Assert(xw_instance_ == 0);
}
+void Instance::PostMessage(Instance* that, const char* msg) {
+ LoggerD("Enter");
+ std::lock_guard<std::mutex> lock(instance_mutex_);
+ 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);
+ }
+}
+
void Instance::PostMessage(const char* msg) {
LoggerD("Enter");
if (!xw_instance_) {
#include <string>
#include <map>
+#include <mutex>
#include <functional>
+#include <unordered_set>
#include "common/platform_exception.h"
#include "common/platform_result.h"
Instance();
virtual ~Instance();
+ static void PostMessage(Instance* that, const char* msg);
+
void PostMessage(const char* msg);
void PostData(const char* msg, uint8_t* buffer, size_t len);
void SendSyncReply(const char* reply);
private:
friend class Extension;
+ static std::mutex instance_mutex_;
+ static std::unordered_set<Instance*> all_instances_;
+
XW_Instance xw_instance_;
};