Commit 1cdb0342 authored by Andrii Grynenko's avatar Andrii Grynenko Committed by Facebook Github Bot

Drop updates if value didn't change

Summary: If observer generator function returned the same shared_ptr it's safe to not propagate such an update.

Reviewed By: yfeldblum

Differential Revision: D13249675

fbshipit-source-id: 334c33e791b664eaec3c2698009f138bef04f8a6
parent 7625683a
...@@ -90,15 +90,14 @@ size_t Core::refresh(size_t version, bool force) { ...@@ -90,15 +90,14 @@ size_t Core::refresh(size_t version, bool force) {
} }
try { try {
{
VersionedData newData{creator_(), version}; VersionedData newData{creator_(), version};
if (!newData.data) { if (!newData.data) {
throw std::logic_error("Observer creator returned nullptr."); throw std::logic_error("Observer creator returned nullptr.");
} }
if (data_.copy().data != newData.data) {
data_.swap(newData); data_.swap(newData);
}
versionLastChange_ = version; versionLastChange_ = version;
}
} catch (...) { } catch (...) {
LOG(ERROR) << "Exception while refreshing Observer: " LOG(ERROR) << "Exception while refreshing Observer: "
<< exceptionStr(std::current_exception()); << exceptionStr(std::current_exception());
......
...@@ -380,3 +380,31 @@ TEST(Observer, WaitForAllUpdates) { ...@@ -380,3 +380,31 @@ TEST(Observer, WaitForAllUpdates) {
folly::observer_detail::ObserverManager::waitForAllUpdates(); folly::observer_detail::ObserverManager::waitForAllUpdates();
} }
TEST(Observer, IgnoreUpdates) {
int callbackCalled = 0;
folly::observer::SimpleObservable<int> observable(42);
auto observer =
folly::observer::makeObserver([even = std::make_shared<bool>(true),
odd = std::make_shared<bool>(false),
observer = observable.getObserver()] {
if (**observer % 2 == 0) {
return even;
}
return odd;
});
auto callbackHandle = observer.addCallback([&](auto) { ++callbackCalled; });
EXPECT_EQ(1, callbackCalled);
observable.setValue(43);
folly::observer_detail::ObserverManager::waitForAllUpdates();
EXPECT_EQ(2, callbackCalled);
observable.setValue(45);
folly::observer_detail::ObserverManager::waitForAllUpdates();
EXPECT_EQ(2, callbackCalled);
observable.setValue(46);
folly::observer_detail::ObserverManager::waitForAllUpdates();
EXPECT_EQ(3, callbackCalled);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment