From 750b20fd852e045586cf2d54ca0dfb217cb08749 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Botond=20D=C3=A9nes?= Date: Mon, 12 Jul 2021 15:07:08 +0300 Subject: [PATCH] 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. --- reader_concurrency_semaphore.cc | 4 ++++ test/boost/reader_concurrency_semaphore_test.cc | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/reader_concurrency_semaphore.cc b/reader_concurrency_semaphore.cc index 4781f3a21f..1e743bbe36 100644 --- a/reader_concurrency_semaphore.cc +++ b/reader_concurrency_semaphore.cc @@ -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); } diff --git a/test/boost/reader_concurrency_semaphore_test.cc b/test/boost/reader_concurrency_semaphore_test.cc index a706a8983f..b10d004f6b 100644 --- a/test/boost/reader_concurrency_semaphore_test.cc +++ b/test/boost/reader_concurrency_semaphore_test.cc @@ -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());