--- nono/vm/renderer.cpp 2026/04/29 17:04:28 1.1 +++ nono/vm/renderer.cpp 2026/04/29 17:04:36 1.1.1.3 @@ -1,15 +1,17 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #include "object.h" #include "bitmap.h" #include "bt454.h" +#include "mythread.h" #include "renderer.h" #include "tvram.h" -Renderer *gRenderer; +std::unique_ptr gRenderer; static void *renderer_run(void *); @@ -25,18 +27,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; } @@ -92,8 +94,7 @@ Renderer::Render() void * renderer_run(void *dummy) { - pthread_setname_np("Renderer"); - pthread_detach(pthread_self()); + PTHREAD_SETNAME("Renderer"); gRenderer->ThreadRun(); return NULL; @@ -139,6 +140,17 @@ Renderer::ThreadRun() } } +// スレッドの終了を指示 (スレッドは動いていること) +void +Renderer::Terminate() +{ + assert(thread_created); + + std::unique_lock lock(mtx); + request |= REQ_TERMINATE; + cv.notify_one(); +} + // // X68030 レンダラ // @@ -216,7 +228,7 @@ LunaRenderer::RenderMain() // dy はレンダラ画面の Y 座標 (RFCNT のラスタカウンタを考慮) // XXX とりあえず1プレーン - plane0 = (uint32 *)mem; + plane0 = (const uint32 *)mem; int sy = vscroll; for (int dy = 0; dy < height; dst0 += width * BPP, dy++, sy++) { sy &= 0x3ff;