use shared_ptr for subscribers vector in event system

Summary:
using shared_ptr for vector of subscribers
Further changes in commit stack support the mutiple subscribers in event system

Reviewed By: davidaurelio

Differential Revision: D15352512

fbshipit-source-id: fac7f4268abf9ca4277734aca2f21cd711eb7d6e
This commit is contained in:
Sidharth Guglani
2019-05-15 08:57:50 -07:00
committed by Facebook Github Bot
parent a9514513a7
commit 1562bce9b4

View File

@@ -7,6 +7,7 @@
#include "event.h" #include "event.h"
#include <memory> #include <memory>
#include <stdexcept> #include <stdexcept>
#include <mutex>
#include <iostream> #include <iostream>
@@ -15,23 +16,29 @@ namespace yoga {
namespace { namespace {
Event::Subscribers& eventSubscribers() { std::mutex& eventSubscribersMutex() {
static Event::Subscribers subscribers = {}; static std::mutex subscribersMutex;
return subscribersMutex;
}
std::shared_ptr<Event::Subscribers>& eventSubscribers() {
static auto subscribers = std::make_shared<Event::Subscribers>();
return subscribers; return subscribers;
} }
} // namespace } // namespace
void Event::reset() { void Event::reset() {
eventSubscribers() = {}; eventSubscribers() = std::make_shared<Event::Subscribers>();
} }
void Event::subscribe(std::function<Subscriber>&& subscriber) { void Event::subscribe(std::function<Subscriber>&& subscriber) {
eventSubscribers().push_back(subscriber); std::lock_guard<std::mutex> guard(eventSubscribersMutex());
eventSubscribers()->push_back(subscriber);
} }
void Event::publish(const YGNode& node, Type eventType, const Data& eventData) { void Event::publish(const YGNode& node, Type eventType, const Data& eventData) {
for (auto& subscriber : eventSubscribers()) { for (auto& subscriber : *eventSubscribers()) {
if (subscriber) { if (subscriber) {
subscriber(node, eventType, eventData); subscriber(node, eventType, eventData);
} }