--- nono/vm/renderer.cpp 2026/04/29 17:04:28 1.1.1.1 +++ nono/vm/renderer.cpp 2026/04/29 17:04:32 1.1.1.2 @@ -9,7 +9,7 @@ #include "renderer.h" #include "tvram.h" -Renderer *gRenderer; +std::unique_ptr gRenderer; static void *renderer_run(void *); @@ -25,18 +25,18 @@ Renderer::~Renderer() { // imagebuf の所有権は持っていないので解放不要。 - // スレッド終了を指示 - std::unique_lock lock(mtx); - request |= REQ_TERMINATE; - cv.notify_one(); + if (thread_created) { + Terminate(); + pthread_join(thread, NULL); + } } bool Renderer::Init() { // レンダリングスレッド起動 - pthread_t th; - pthread_create(&th, NULL, renderer_run, NULL); + pthread_create(&thread, NULL, renderer_run, NULL); + thread_created = true; return true; } @@ -93,7 +93,6 @@ void * renderer_run(void *dummy) { pthread_setname_np("Renderer"); - pthread_detach(pthread_self()); gRenderer->ThreadRun(); return NULL; @@ -139,6 +138,17 @@ Renderer::ThreadRun() } } +// スレッドの終了を指示 (スレッドは動いていること) +void +Renderer::Terminate() +{ + assert(thread_created); + + std::unique_lock lock(mtx); + request |= REQ_TERMINATE; + cv.notify_one(); +} + // // X68030 レンダラ //