wait.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include "wait.h"
  2. #include "wait_group.h"
  3. #include "wait_policy.h"
  4. namespace NThreading {
  5. namespace {
  6. template <class WaitPolicy>
  7. TFuture<void> WaitGeneric(const TFuture<void>& f1) {
  8. return f1;
  9. }
  10. template <class WaitPolicy>
  11. TFuture<void> WaitGeneric(const TFuture<void>& f1, const TFuture<void>& f2) {
  12. TWaitGroup<WaitPolicy> wg;
  13. wg.Add(f1).Add(f2);
  14. return std::move(wg).Finish();
  15. }
  16. template <class WaitPolicy>
  17. TFuture<void> WaitGeneric(TArrayRef<const TFuture<void>> futures) {
  18. if (futures.empty()) {
  19. return MakeFuture();
  20. }
  21. if (futures.size() == 1) {
  22. return futures.front();
  23. }
  24. TWaitGroup<WaitPolicy> wg;
  25. for (const auto& fut : futures) {
  26. wg.Add(fut);
  27. }
  28. return std::move(wg).Finish();
  29. }
  30. }
  31. ////////////////////////////////////////////////////////////////////////////////
  32. TFuture<void> WaitAll(const TFuture<void>& f1) {
  33. return WaitGeneric<TWaitPolicy::TAll>(f1);
  34. }
  35. TFuture<void> WaitAll(const TFuture<void>& f1, const TFuture<void>& f2) {
  36. return WaitGeneric<TWaitPolicy::TAll>(f1, f2);
  37. }
  38. TFuture<void> WaitAll(TArrayRef<const TFuture<void>> futures) {
  39. return WaitGeneric<TWaitPolicy::TAll>(futures);
  40. }
  41. ////////////////////////////////////////////////////////////////////////////////
  42. TFuture<void> WaitExceptionOrAll(const TFuture<void>& f1) {
  43. return WaitGeneric<TWaitPolicy::TExceptionOrAll>(f1);
  44. }
  45. TFuture<void> WaitExceptionOrAll(const TFuture<void>& f1, const TFuture<void>& f2) {
  46. return WaitGeneric<TWaitPolicy::TExceptionOrAll>(f1, f2);
  47. }
  48. TFuture<void> WaitExceptionOrAll(TArrayRef<const TFuture<void>> futures) {
  49. return WaitGeneric<TWaitPolicy::TExceptionOrAll>(futures);
  50. }
  51. ////////////////////////////////////////////////////////////////////////////////
  52. TFuture<void> WaitAny(const TFuture<void>& f1) {
  53. return WaitGeneric<TWaitPolicy::TAny>(f1);
  54. }
  55. TFuture<void> WaitAny(const TFuture<void>& f1, const TFuture<void>& f2) {
  56. return WaitGeneric<TWaitPolicy::TAny>(f1, f2);
  57. }
  58. TFuture<void> WaitAny(TArrayRef<const TFuture<void>> futures) {
  59. return WaitGeneric<TWaitPolicy::TAny>(futures);
  60. }
  61. }