From f02501491e262c52b65c3fea6e180814e132dad8 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 13 Sep 2024 00:56:17 +0200 Subject: Hopefully fix occasional hang in j2k_encoder_deadlock_test. Previously too many frames were queued for encoding, which AFAICS meant that (if the CPU was busy) we would get to the point where too many frames were in the encoder queue, so that we blocked waiting for it to clear, and then simultaneously too many frames were in the writer queue, which (in this test) would never clear. At this point we would be backed up waiting for Writer::write() to happen in J2KEncoder::encoder_thread() so that the encoder queue could be cleared, but nobody is calling Writer::write(). --- test/j2k_encoder_test.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'test/j2k_encoder_test.cc') diff --git a/test/j2k_encoder_test.cc b/test/j2k_encoder_test.cc index bc3bd97b2..b3167dacc 100644 --- a/test/j2k_encoder_test.cc +++ b/test/j2k_encoder_test.cc @@ -44,19 +44,25 @@ BOOST_AUTO_TEST_CASE(j2k_encoder_deadlock_test) auto film = new_test_film2("j2k_encoder_deadlock_test"); + auto constexpr threads = 4; + /* Don't call ::start() on this Writer, so it can never write anything */ Writer writer(film, {}); - writer.set_encoder_threads(4); + writer.set_encoder_threads(threads); /* We want to test the case where the writer queue fills, and this can't happen unless there * are enough encoding threads (each of which will end up waiting for the writer to empty, * which will never happen). */ - Config::instance()->set_master_encoding_threads(4); + Config::instance()->set_master_encoding_threads(threads); J2KEncoder encoder(film, writer); encoder.begin(); - for (int i = 0; i < 26; ++i) { + /* The queue will be full when we write another frame when there are already + * more than (threads * frames_in_memory_multiplier [i.e. 3]) + * in the queue, so to fill the queue we must add threads * 3 + 2. + */ + for (int i = 0; i < (threads * 3) + 2; ++i) { auto image = make_shared(AV_PIX_FMT_RGB24, dcp::Size(1998, 1080), Image::Alignment::PADDED); auto image_proxy = make_shared(image); encoder.encode( -- cgit v1.2.3