diff --git a/eden/fs/utils/ImmediateFuture-inl.h b/eden/fs/utils/ImmediateFuture-inl.h index 8aadc7ec4f..b4664afa9b 100644 --- a/eden/fs/utils/ImmediateFuture-inl.h +++ b/eden/fs/utils/ImmediateFuture-inl.h @@ -59,28 +59,28 @@ ImmediateFuture::thenTry(Func&& func) && { } template -T ImmediateFuture::get() && { +T ImmediateFuture::get(folly::HighResDuration timeout) && { return std::visit( - [](auto&& inner) -> T { + [timeout](auto&& inner) -> T { using Type = std::decay_t; if constexpr (std::is_same_v>) { return std::move(inner).value(); } else { - return std::move(inner).get(); + return std::move(inner).get(timeout); } }, std::move(inner_)); } template -folly::Try ImmediateFuture::getTry() && { +folly::Try ImmediateFuture::getTry(folly::HighResDuration timeout) && { return std::visit( - [](auto&& inner) -> folly::Try { + [timeout](auto&& inner) -> folly::Try { using Type = std::decay_t; if constexpr (std::is_same_v>) { return std::move(inner); } else { - return std::move(inner).getTry(); + return std::move(inner).getTry(timeout); } }, std::move(inner_)); diff --git a/eden/fs/utils/ImmediateFuture.h b/eden/fs/utils/ImmediateFuture.h index 00e97610d1..f0a6847a98 100644 --- a/eden/fs/utils/ImmediateFuture.h +++ b/eden/fs/utils/ImmediateFuture.h @@ -126,15 +126,20 @@ class ImmediateFuture { * exception. * * When the future is an immediate value, this returns without waiting. + * + * A folly::FutureTimeout will be thrown if the timeout is reached. */ - T get() &&; + T get(folly::HighResDuration timeout = folly::HighResDuration::max()) &&; /** * Wait for the future to complete and return the Try value. * * When the future is an immediate value, this returns without waiting. + * + * A folly::FutureTimeout will be thrown if the timeout is reached. */ - folly::Try getTry() &&; + folly::Try getTry( + folly::HighResDuration timeout = folly::HighResDuration::max()) &&; bool hasImmediate() const { return std::holds_alternative>(inner_); diff --git a/eden/fs/utils/test/ImmediateFutureTest.cpp b/eden/fs/utils/test/ImmediateFutureTest.cpp index 3efc44de20..0d2a08bc9b 100644 --- a/eden/fs/utils/test/ImmediateFutureTest.cpp +++ b/eden/fs/utils/test/ImmediateFutureTest.cpp @@ -11,6 +11,7 @@ #include using namespace facebook::eden; +using namespace std::literals::chrono_literals; TEST(ImmediateFuture, get) { int value = 42; @@ -171,3 +172,9 @@ TEST(ImmediateFuture, mutableLambda) { [foo](auto&& value) mutable { return value + foo.getNonConstVal(); }); EXPECT_EQ(std::move(setFooFut).get(), 43); } + +TEST(ImmediateFuture, getTimeout) { + auto [promise, semiFut] = folly::makePromiseContract(); + ImmediateFuture fut{std::move(semiFut)}; + EXPECT_THROW(std::move(fut).get(0ms), folly::FutureTimeout); +}