Fix Observable to not trigger unneccessary refresh if the value didn't change
authorAndrii Grynenko <andrii@fb.com>
Thu, 15 Jun 2017 21:37:41 +0000 (14:37 -0700)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Thu, 15 Jun 2017 21:50:50 +0000 (14:50 -0700)
Differential Revision: D5251218

fbshipit-source-id: 1ceb37dd727e8ac2fd842e2c437cdaa9017221c8

folly/experimental/observer/Observable-inl.h

index 231991e..14d3339 100644 (file)
@@ -49,7 +49,10 @@ class ObserverCreator<Observable, Traits>::Context {
     // callbacks (getting new value from observable and storing it into value_
     // is not atomic).
     std::lock_guard<std::mutex> lg(updateMutex_);
-    updateValue();
+    if (!updateValue()) {
+      // Value didn't change, so we can skip the version update.
+      return;
+    }
 
     bool expected = false;
     if (updateRequested_.compare_exchange_strong(expected, true)) {
@@ -63,12 +66,14 @@ class ObserverCreator<Observable, Traits>::Context {
   }
 
  private:
-  void updateValue() {
+  bool updateValue() {
     auto newValue = Traits::get(observable_);
+    auto newValuePtr = newValue.get();
     if (!newValue) {
       throw std::logic_error("Observable returned nullptr.");
     }
     value_.swap(newValue);
+    return newValuePtr != newValue.get();
   }
 
   folly::Synchronized<std::shared_ptr<const T>> value_;