mutex lock while accessing event subscribers vector for thread safety

Summary: Using Mutex lock_guard mechanism when writing to subscribers and when accessing them in publish to make a copy

Reviewed By: davidaurelio

Differential Revision: D15391679

fbshipit-source-id: 16713ff28ce1762a5ca4c48c152897a92417e80b
This commit is contained in:
Sidharth Guglani
2019-05-19 23:29:28 -07:00
committed by Facebook Github Bot
parent 8dc46c0a87
commit aa71dbb5bd

View File

@@ -34,11 +34,19 @@ void Event::reset() {
void Event::subscribe(std::function<Subscriber>&& subscriber) { void Event::subscribe(std::function<Subscriber>&& subscriber) {
std::lock_guard<std::mutex> guard(eventSubscribersMutex()); std::lock_guard<std::mutex> guard(eventSubscribersMutex());
eventSubscribers() =
std::make_shared<Event::Subscribers>(*eventSubscribers());
eventSubscribers()->push_back(subscriber); 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()) { std::shared_ptr<Event::Subscribers> subscribers;
{
std::lock_guard<std::mutex> guard(eventSubscribersMutex());
subscribers = eventSubscribers();
}
for (auto& subscriber : *subscribers) {
if (subscriber) { if (subscriber) {
subscriber(node, eventType, eventData); subscriber(node, eventType, eventData);
} }