From b6e42517e5ff61374dfa5ae04cf8482b07d9eece Mon Sep 17 00:00:00 2001 From: Valentin Shergin Date: Thu, 13 Sep 2018 22:56:02 -0700 Subject: [PATCH] Fabric: Now `EventEmitter::setEnabled()` relies on stored `eventTarget` is not being nullptr Summary: This diff implements a new model of managing `enabled` flag in EventEmitter. Now we simply rely on `eventTarget_` is not being `nullptr` (and we reset the pointer to "disable" the event emitter). Reviewed By: mdvacca Differential Revision: D9764857 fbshipit-source-id: 1dd3ce0c8589048babbf2dbac9f8359358b31a34 --- ReactCommon/fabric/events/EventEmitter.cpp | 10 +++++++--- ReactCommon/fabric/events/EventEmitter.h | 3 ++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/ReactCommon/fabric/events/EventEmitter.cpp b/ReactCommon/fabric/events/EventEmitter.cpp index 9d8b0ffbd..213a80f2d 100644 --- a/ReactCommon/fabric/events/EventEmitter.cpp +++ b/ReactCommon/fabric/events/EventEmitter.cpp @@ -76,14 +76,18 @@ void EventEmitter::dispatchEvent( } void EventEmitter::setEnabled(bool enabled) const { - enabled_ = enabled; + bool alreadyEnabled = eventTarget_ != nullptr; + if (enabled == alreadyEnabled) { + return; + } + if (!enabled) { - eventTarget_ = nullptr; + eventTarget_.reset(); } } bool EventEmitter::getEnabled() const { - return enabled_; + return eventTarget_ != nullptr; } } // namespace react diff --git a/ReactCommon/fabric/events/EventEmitter.h b/ReactCommon/fabric/events/EventEmitter.h index 788f4c2cf..eb757b4a8 100644 --- a/ReactCommon/fabric/events/EventEmitter.h +++ b/ReactCommon/fabric/events/EventEmitter.h @@ -56,6 +56,8 @@ public: /* * Indicates that an event can be delivered to `eventTarget`. * Callsite must acquire `DispatchMutex` to access those methods. + * The `setEnabled` operation is not guaranteed: the `EventEmitter` cannot + * be re-enabled after disabling; in this case, the method does nothing. */ void setEnabled(bool enabled) const; bool getEnabled() const; @@ -75,7 +77,6 @@ private: mutable SharedEventTarget eventTarget_; Tag tag_; WeakEventDispatcher eventDispatcher_; - mutable bool enabled_; // Protected by `DispatchMutex`. }; } // namespace react