reader_concurrency_semaphore: allow destroying without stop() when not used yet

To make it easier to construct objects with semaphore members. When the
construction of such object fails, they can now just destroy their
semaphore member as usual, without having to employ tricks to make sure
its is stopped before.
This commit is contained in:
Botond Dénes
2021-07-12 15:07:08 +03:00
parent 03959a332b
commit 750b20fd85
2 changed files with 10 additions and 0 deletions

View File

@@ -410,6 +410,10 @@ reader_concurrency_semaphore::reader_concurrency_semaphore(no_limits, sstring na
std::move(name)) {}
reader_concurrency_semaphore::~reader_concurrency_semaphore() {
if (!_permit_list->stats.total_permits) {
// We allow destroy without stop() when the semaphore wasn't used at all yet.
return;
}
assert(_stopped);
}

View File

@@ -554,6 +554,12 @@ SEASTAR_THREAD_TEST_CASE(reader_concurrency_semaphore_dump_reader_diganostics) {
}
SEASTAR_THREAD_TEST_CASE(test_reader_concurrency_semaphore_stop_waits_on_permits) {
BOOST_TEST_MESSAGE("unused");
{
reader_concurrency_semaphore semaphore(reader_concurrency_semaphore::no_limits{}, get_name());
// Checks for stop() should not be triggered.
}
BOOST_TEST_MESSAGE("0 permits");
{
reader_concurrency_semaphore semaphore(reader_concurrency_semaphore::no_limits{}, get_name());