Remove busy wait
authorAlexander Shaposhnikov <alexshap@fb.com>
Tue, 10 Nov 2015 23:42:18 +0000 (15:42 -0800)
committerfacebook-github-bot-4 <folly-bot@fb.com>
Wed, 11 Nov 2015 00:20:20 +0000 (16:20 -0800)
commit52b003afab5e0bae90dbc773893ef604dd3d68c1
tree4ecdf83ad1c4ac781da5c4ad588535c438f1139d
parent658a60b37dd3af1676d7212bdef4cb2077191c56
Remove busy wait

Summary: Wait uses baton & callback running baton.post
when the original future is ready. However wrapping baton.post
with a funciton call (preparing a new value) adds the following race: baton.wait wakes up
before that function has call actually finished.
The explanation is the following: to prepare the value of the new future it's necessary
1. baton.post() 2. set the value (move constructor, memory operations, ...)
and this code is executed in a separate thread.
The main idea of this fix is to avoid creating a new future
(whose value is calculated using that 2-step procedure)
and set a callback instead. This callback will be executed when the future is ready and actually
it either will be the last step of promise.setValue or it will run immediately if the future
we are waiting for already contains a value.

Reviewed By: fugalh

Differential Revision: D2636409

fb-gh-sync-id: df3e9bbcc56a5fac5834ffecc63f1bcb94ace02c
folly/futures/Future-inl.h