Skip to content

Commit

Permalink
Change race_volume::finish(...) to return true on first sufficient.
Browse files Browse the repository at this point in the history
  • Loading branch information
evoskuil committed May 22, 2024
1 parent a91393e commit 50f4c69
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 23 deletions.
2 changes: 1 addition & 1 deletion include/bitcoin/network/async/race_quality.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ class race_quality final
/// False implies invalid usage.
bool start(handler&& complete) NOEXCEPT;

/// True implies winning finisher (first not failed).
/// True implies winning finisher (first that is not failed).
/// First arg is an 'error code', cast to bool (failed if true).
/// There may be no winner, in which case last finish is invoked.
bool finish(const Args&... args) NOEXCEPT;
Expand Down
2 changes: 1 addition & 1 deletion include/bitcoin/network/async/race_speed.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ class race_speed final
/// False implies invalid usage.
bool start(handler&& complete) NOEXCEPT;

/// True implies winning finisher.
/// True implies winning finisher, there is always exactly one.
bool finish(const Args&... args) NOEXCEPT;

private:
Expand Down
2 changes: 1 addition & 1 deletion include/bitcoin/network/async/race_volume.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ class race_volume final
/// False implies invalid usage.
bool start(handler&& sufficient, handler&& complete) NOEXCEPT;

/// Signal finisher and pass total count.
/// True implies first sufficient count (there may be none).
bool finish(size_t count) NOEXCEPT;

private:
Expand Down
7 changes: 5 additions & 2 deletions include/bitcoin/network/impl/async/race_volume.ipp
Original file line number Diff line number Diff line change
Expand Up @@ -74,12 +74,15 @@ finish(size_t count) NOEXCEPT
if (!running())
return false;

// Determine sufficiency, since not yet reached.
bool winner{ false };

// Determine sufficiency if not yet reached.
if (sufficient_)
{
// Invoke sufficient and clear resources before race is finished.
if (count >= required_)
{
winner = true;
(*sufficient_)(Success);
sufficient_.reset();
}
Expand All @@ -91,7 +94,7 @@ finish(size_t count) NOEXCEPT
}

// false invoke implies logic error.
return invoke();
return invoke() && winner;
}

// private
Expand Down
36 changes: 18 additions & 18 deletions test/async/race_volume.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,9 @@ BOOST_AUTO_TEST_CASE(race_volume__start__unstarted__true_running)
BOOST_REQUIRE(race_volume.running());

// Avoid running at destruct assertion.
BOOST_REQUIRE(race_volume.finish(2));
BOOST_REQUIRE(!race_volume.finish(2));
BOOST_REQUIRE(race_volume.running());
BOOST_REQUIRE(race_volume.finish(4));
BOOST_REQUIRE(!race_volume.finish(4));
BOOST_REQUIRE(!race_volume.running());
}

Expand All @@ -55,11 +55,11 @@ BOOST_AUTO_TEST_CASE(race_volume__start__started__false_running)
BOOST_REQUIRE(race_volume.running());

// Avoid running at destruct assertion.
BOOST_REQUIRE(race_volume.finish(1));
BOOST_REQUIRE(!race_volume.finish(1));
BOOST_REQUIRE(!race_volume.running());
}

BOOST_AUTO_TEST_CASE(race_volume__running__3_of_3__failed_sufficient_complete)
BOOST_AUTO_TEST_CASE(race_volume__running__3_of_3__insufficient_complete)
{
race_volume_t race_volume{ 3, 10 };
BOOST_REQUIRE(!race_volume.running());
Expand All @@ -79,23 +79,23 @@ BOOST_AUTO_TEST_CASE(race_volume__running__3_of_3__failed_sufficient_complete)
BOOST_REQUIRE_EQUAL(sufficient, error::unknown);
BOOST_REQUIRE_EQUAL(complete, error::unknown);

BOOST_REQUIRE(race_volume.finish(1));
BOOST_REQUIRE(!race_volume.finish(1));
BOOST_REQUIRE(race_volume.running());
BOOST_REQUIRE_EQUAL(sufficient, error::unknown);
BOOST_REQUIRE_EQUAL(complete, error::unknown);

BOOST_REQUIRE(race_volume.finish(1));
BOOST_REQUIRE(!race_volume.finish(1));
BOOST_REQUIRE(race_volume.running());
BOOST_REQUIRE_EQUAL(sufficient, error::unknown);
BOOST_REQUIRE_EQUAL(complete, error::unknown);

BOOST_REQUIRE(race_volume.finish(1));
BOOST_REQUIRE(!race_volume.finish(1));
BOOST_REQUIRE(!race_volume.running());
BOOST_REQUIRE_EQUAL(sufficient, error::invalid_magic);
BOOST_REQUIRE_EQUAL(complete, error::success);
}

BOOST_AUTO_TEST_CASE(race_volume__running__4_of_3__false_finish)
BOOST_AUTO_TEST_CASE(race_volume__running__4_of_3__insufficient)
{
race_volume_t race_volume{ 3, 10 };
BOOST_REQUIRE(!race_volume.running());
Expand All @@ -112,9 +112,9 @@ BOOST_AUTO_TEST_CASE(race_volume__running__4_of_3__false_finish)
complete = ec;
}));
BOOST_REQUIRE(race_volume.running());
BOOST_REQUIRE(race_volume.finish(1));
BOOST_REQUIRE(race_volume.finish(1));
BOOST_REQUIRE(race_volume.finish(1));
BOOST_REQUIRE(!race_volume.finish(1));
BOOST_REQUIRE(!race_volume.finish(1));
BOOST_REQUIRE(!race_volume.finish(1));
BOOST_REQUIRE(!race_volume.finish(1));
}

Expand Down Expand Up @@ -155,7 +155,7 @@ BOOST_AUTO_TEST_CASE(race_volume__finish__early_sufficiency__resources_deleted_a
BOOST_REQUIRE(!bar_deleted);

// First finish is neither sufficient nor complete.
BOOST_REQUIRE(race_volume.finish(5));
BOOST_REQUIRE(!race_volume.finish(5));
BOOST_REQUIRE(race_volume.running());
BOOST_REQUIRE_EQUAL(sufficient.first, error::unknown);
BOOST_REQUIRE_EQUAL(complete.first, error::unknown);
Expand All @@ -175,7 +175,7 @@ BOOST_AUTO_TEST_CASE(race_volume__finish__early_sufficiency__resources_deleted_a
BOOST_REQUIRE(!bar_deleted);

// Third finish is complete.
BOOST_REQUIRE(race_volume.finish(42));
BOOST_REQUIRE(!race_volume.finish(42));
BOOST_REQUIRE(!race_volume.running());
BOOST_REQUIRE_EQUAL(sufficient.first, error::success);
BOOST_REQUIRE_EQUAL(complete.first, error::success);
Expand Down Expand Up @@ -222,7 +222,7 @@ BOOST_AUTO_TEST_CASE(race_volume__finish__late_insufficiency__resources_deleted_
BOOST_REQUIRE(!bar_deleted);

// First finish is neither sufficient nor complete.
BOOST_REQUIRE(race_volume.finish(5));
BOOST_REQUIRE(!race_volume.finish(5));
BOOST_REQUIRE(race_volume.running());
BOOST_REQUIRE_EQUAL(sufficient.first, error::unknown);
BOOST_REQUIRE_EQUAL(complete.first, error::unknown);
Expand All @@ -232,7 +232,7 @@ BOOST_AUTO_TEST_CASE(race_volume__finish__late_insufficiency__resources_deleted_
BOOST_REQUIRE(!bar_deleted);

// Second finish is neither sufficient nor complete.
BOOST_REQUIRE(race_volume.finish(9));
BOOST_REQUIRE(!race_volume.finish(9));
BOOST_REQUIRE(race_volume.running());
BOOST_REQUIRE_EQUAL(sufficient.first, error::unknown);
BOOST_REQUIRE_EQUAL(complete.first, error::unknown);
Expand All @@ -242,7 +242,7 @@ BOOST_AUTO_TEST_CASE(race_volume__finish__late_insufficiency__resources_deleted_
BOOST_REQUIRE(!bar_deleted);

// Third finish is insufficient and complete.
BOOST_REQUIRE(race_volume.finish(9));
BOOST_REQUIRE(!race_volume.finish(9));
BOOST_REQUIRE(!race_volume.running());
BOOST_REQUIRE_EQUAL(sufficient.first, error::invalid_magic);
BOOST_REQUIRE_EQUAL(complete.first, error::success);
Expand Down Expand Up @@ -289,7 +289,7 @@ BOOST_AUTO_TEST_CASE(race_volume__finish__late_sufficiency__resources_deleted_as
BOOST_REQUIRE(!bar_deleted);

// First finish is neither sufficient nor complete.
BOOST_REQUIRE(race_volume.finish(5));
BOOST_REQUIRE(!race_volume.finish(5));
BOOST_REQUIRE(race_volume.running());
BOOST_REQUIRE_EQUAL(sufficient.first, error::unknown);
BOOST_REQUIRE_EQUAL(complete.first, error::unknown);
Expand All @@ -299,7 +299,7 @@ BOOST_AUTO_TEST_CASE(race_volume__finish__late_sufficiency__resources_deleted_as
BOOST_REQUIRE(!bar_deleted);

// Second finish is neither sufficient nor complete.
BOOST_REQUIRE(race_volume.finish(9));
BOOST_REQUIRE(!race_volume.finish(9));
BOOST_REQUIRE(race_volume.running());
BOOST_REQUIRE_EQUAL(sufficient.first, error::unknown);
BOOST_REQUIRE_EQUAL(complete.first, error::unknown);
Expand Down

0 comments on commit 50f4c69

Please sign in to comment.