Summary:
There's a race condition in waitWithSemaphore, specifically because we're
returning a new future that's completed by the input future. As a result,
that future may not be completed by the time waitWithSemaphore returns,
although completion should be imminent.
Test Plan:
`var=0; while true ; do echo $((var++)); _bin/folly/wangle/wangle-test --gtest_filter='Future*' || break ; done`
Before change two runs yielded 303 and 371.
After change I killed the test at 11000.
Reviewed By: njormrod@fb.com
Subscribers: fugalh, njormrod
FB internal diff:
D1561281
Tasks:
5180879
#pragma once
#include <chrono>
+#include <thread>
#include <folly/wangle/detail/State.h>
#include <folly/Baton.h>
return std::move(t.value());
});
baton.wait();
+ while (!done.isReady()) {
+ // There's a race here between the return here and the actual finishing of
+ // the future. f is completed, but the setup may not have finished on done
+ // after the baton has posted.
+ std::this_thread::yield();
+ }
return done;
}
t.value();
});
baton.wait();
+ while (!done.isReady()) {
+ // There's a race here between the return here and the actual finishing of
+ // the future. f is completed, but the setup may not have finished on done
+ // after the baton has posted.
+ std::this_thread::yield();
+ }
return done;
}