From 8035a6ae4e3e853e26ef4dab47e13b4c7748d350 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lo=C3=AFse=20Brosseau?= Date: Thu, 30 Apr 2026 10:01:49 -0400 Subject: [PATCH 1/2] Make the writer thread call MovieRV::uninit instead of the main thread MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Éloïse Brosseau --- src/bin/imgtools/rvio/main.cpp | 6 +----- src/lib/image/TwkMovie/ThreadedMovie.cpp | 12 +++++++++++- src/lib/image/TwkMovie/TwkMovie/ThreadedMovie.h | 5 ++++- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/bin/imgtools/rvio/main.cpp b/src/bin/imgtools/rvio/main.cpp index 2fd3441e5..42f0b8420 100644 --- a/src/bin/imgtools/rvio/main.cpp +++ b/src/bin/imgtools/rvio/main.cpp @@ -1646,7 +1646,7 @@ int utf8Main(int argc, char* argv[]) threadAPI.create = GC_pthread_create; threadAPI.join = GC_pthread_join; threadAPI.detach = GC_pthread_detach; - outmov = new ThreadedMovie(inputMovies, outFrames, 8, &threadAPI, threadedMovieInit); + outmov = new ThreadedMovie(inputMovies, outFrames, 8, &threadAPI, threadedMovieInit, MovieRV::uninit); #endif #endif @@ -1739,10 +1739,6 @@ int utf8Main(int argc, char* argv[]) if (!writer->write(outmov, outfile, writeRequest)) exit(-2); - - // clean up any frame buffers we allocated writing the movie - // - MovieRV::uninit(); } catch (TwkExc::Exception& exc) { diff --git a/src/lib/image/TwkMovie/ThreadedMovie.cpp b/src/lib/image/TwkMovie/ThreadedMovie.cpp index c911e84e4..005beed50 100644 --- a/src/lib/image/TwkMovie/ThreadedMovie.cpp +++ b/src/lib/image/TwkMovie/ThreadedMovie.cpp @@ -19,7 +19,8 @@ namespace TwkMovie mov->threadMain(); } - ThreadedMovie::ThreadedMovie(const Movies& movies, const Frames& frames, size_t stackMultiplier, ThreadAPI* api, InitializeFunc F) + ThreadedMovie::ThreadedMovie(const Movies& movies, const Frames& frames, size_t stackMultiplier, ThreadAPI* api, InitializeFunc F, + FinalizeFunc finalizeFunction) : m_movies(movies) , m_threadGroup(movies.size(), stackMultiplier, api) , m_frames(frames) @@ -27,6 +28,7 @@ namespace TwkMovie , m_currentIndex(0) , m_requestIndex(0) , m_initialize(F) + , m_finalize(finalizeFunction) { // if (!m_movie->isThreadSafe()) throw runtime_exception(); m_info = movies.front()->info(); @@ -188,8 +190,16 @@ namespace TwkMovie m_threadGroup.lock(m_runLock); td->running = false; + + bool allFramesDone = (m_currentIndex >= m_frames.size()); + m_threadGroup.unlock(m_runLock); + if (allFramesDone && m_finalize != nullptr) + { + m_finalize(); + } + // cout << "thread " << td->id << " no longer running" << endl; } diff --git a/src/lib/image/TwkMovie/TwkMovie/ThreadedMovie.h b/src/lib/image/TwkMovie/TwkMovie/ThreadedMovie.h index 11b0f7456..18d71d0b0 100644 --- a/src/lib/image/TwkMovie/TwkMovie/ThreadedMovie.h +++ b/src/lib/image/TwkMovie/TwkMovie/ThreadedMovie.h @@ -57,8 +57,10 @@ namespace TwkMovie typedef std::vector Movies; typedef stl_ext::thread_group::thread_api ThreadAPI; typedef void (*InitializeFunc)(); + using FinalizeFunc = void (*)(); - ThreadedMovie(const Movies&, const Frames& frames, size_t stackMultiplier = 8, ThreadAPI* api = 0, InitializeFunc = NULL); + ThreadedMovie(const Movies&, const Frames& frames, size_t stackMultiplier = 8, ThreadAPI* api = nullptr, InitializeFunc = nullptr, + FinalizeFunc = nullptr); virtual ~ThreadedMovie(); @@ -104,6 +106,7 @@ namespace TwkMovie int m_requestIndex; bool m_init; InitializeFunc m_initialize; + FinalizeFunc m_finalize; }; } // namespace TwkMovie From 5f0bcd7ccbf1d26fcb70a79e4f008f424fe9d30b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lo=C3=AFse=20Brosseau?= Date: Thu, 30 Apr 2026 10:02:37 -0400 Subject: [PATCH 2/2] Replace dummyDev raw pointer with unique_ptr to FBOVideoDevice MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Éloïse Brosseau --- src/bin/imgtools/rvio/main.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/bin/imgtools/rvio/main.cpp b/src/bin/imgtools/rvio/main.cpp index 42f0b8420..0d5c51e3f 100644 --- a/src/bin/imgtools/rvio/main.cpp +++ b/src/bin/imgtools/rvio/main.cpp @@ -970,14 +970,8 @@ int utf8Main(int argc, char* argv[]) setEnvVar("LC_ALL", "C"); TwkFB::ThreadPool::initialize(); - // - // XXX dummyDev is leaking here. Best would be to pass it to the App so - // that it could delete it after startup, since it's no longer needed at - // that point. - // - #ifdef RVIO_HW - TwkGLF::FBOVideoDevice* dummyDev = new TwkGLF::FBOVideoDevice(0, 10, 10, false); + auto dummyDev = std::make_unique(nullptr, 10, 10, false); #else TwkGLF::OSMesaVideoDevice* dummyDev = new TwkGLF::OSMesaVideoDevice(0, 10, 10, true); FrameBuffer* dummyFB = new FrameBuffer(10, 10, 4, FrameBuffer::FLOAT);