diff --git a/desmume/src/rasterize.cpp b/desmume/src/rasterize.cpp index d661a7aed..4214eb2b6 100644 --- a/desmume/src/rasterize.cpp +++ b/desmume/src/rasterize.cpp @@ -939,6 +939,7 @@ public: static Task rasterizerUnitTask[4]; static RasterizerUnit rasterizerUnit[4]; static int rasterizerCores; +static bool rasterizerUnitTasksInited = false; static void* execRasterizerUnit(void* arg) { @@ -949,9 +950,10 @@ static void* execRasterizerUnit(void* arg) static char SoftRastInit(void) { - static bool tables_generated = false; - if(!tables_generated) + if(!rasterizerUnitTasksInited) { + rasterizerUnitTasksInited = true; + if(CommonSettings.num_cores>=4) { rasterizerCores = 4; @@ -981,8 +983,11 @@ static char SoftRastInit(void) rasterizerUnit[0].SLI_MASK = 0; rasterizerUnit[0].SLI_VALUE = 0; } + } - + static bool tables_generated = false; + if(!tables_generated) + { tables_generated = true; clipper.clippedPolys = clippedPolys = new GFX3D_Clipper::TClippedPoly[POLYLIST_SIZE*2]; @@ -1023,6 +1028,9 @@ static void SoftRastReset() { static void SoftRastClose() { + for(int i=0;i<4;i++) + rasterizerUnitTask[i].shutdown(); + rasterizerUnitTasksInited = false; } static void SoftRastVramReconfigureSignal() { diff --git a/desmume/src/utils/task.cpp b/desmume/src/utils/task.cpp index b76b8ef27..599fd0baf 100644 --- a/desmume/src/utils/task.cpp +++ b/desmume/src/utils/task.cpp @@ -32,6 +32,7 @@ public: bool spinlock; void start(bool spinlock); + void shutdown(); //execute some work void execute(const TWork &work, void* param); @@ -60,14 +61,7 @@ static void* killTask(void* task) Task::Impl::~Impl() { - if(!bStarted) return; - - execute(killTask,this); - finish(); - - CloseHandle(incomingWork); - CloseHandle(workDone); - CloseHandle(hThread); + shutdown(); } Task::Impl::Impl() @@ -76,6 +70,9 @@ Task::Impl::Impl() , bWorkDone(true) , bKill(false) , bStarted(false) + , incomingWork(INVALID_HANDLE_VALUE) + , workDone(INVALID_HANDLE_VALUE) + , hThread(INVALID_HANDLE_VALUE) { } @@ -112,6 +109,22 @@ void Task::Impl::start(bool spinlock) workDone = CreateEvent(NULL,FALSE,FALSE,NULL); hThread = CreateThread(NULL,0,Task::Impl::s_taskProc,(void*)this, 0, NULL); } +void Task::Impl::shutdown() +{ + if(!bStarted) return; + bStarted = false; + + execute(killTask,this); + finish(); + + CloseHandle(incomingWork); + CloseHandle(workDone); + CloseHandle(hThread); + + incomingWork = INVALID_HANDLE_VALUE; + workDone = INVALID_HANDLE_VALUE; + hThread = INVALID_HANDLE_VALUE; +} void Task::Impl::execute(const TWork &work, void* param) { @@ -144,6 +157,7 @@ public: ~Impl() {} void start(bool spinlock) {} + void shutdown() {} void* ret; void execute(const TWork &work, void* param) { ret = work(param); } @@ -168,7 +182,8 @@ public: pthread_t thread; static void* s_taskProc(void *ptr); void taskProc(); - void init(); + void start(); + void shutdown(); //the work function that shall be executed TWork work; @@ -243,11 +258,18 @@ void Task::Impl::taskProc() } } -void Task::Impl::init() +void Task::Impl::start() { pthread_create( &thread, NULL, Task::Impl::s_taskProc, (void*)this ); initialized = true; } +void Task::Impl::shutdown() +{ + if(!initialized) + return; + // pthread_join or something, NYI, this code is all disabled anyway at the time of this writing + initialized = false; +} void Task::Impl::execute(const TWork &work, void* param) { @@ -271,6 +293,7 @@ void* Task::Impl::finish() #endif void Task::start(bool spinlock) { impl->start(spinlock); } +void Task::shutdown() { impl->shutdown(); } Task::Task() : impl(new Task::Impl()) {} Task::~Task() { delete impl; } void Task::execute(const TWork &work, void* param) { impl->execute(work,param); } diff --git a/desmume/src/utils/task.h b/desmume/src/utils/task.h index d97874ec1..438fac5f1 100644 --- a/desmume/src/utils/task.h +++ b/desmume/src/utils/task.h @@ -29,6 +29,7 @@ public: typedef void * (*TWork)(void *); + // initialize task runner void start(bool spinlock); //execute some work @@ -37,6 +38,9 @@ public: //wait for the work to complete void* finish(); + // does the opposite of start + void shutdown(); + class Impl; Impl *impl; diff --git a/desmume/src/windows/main.cpp b/desmume/src/windows/main.cpp index cb330b08e..5f9655002 100644 --- a/desmume/src/windows/main.cpp +++ b/desmume/src/windows/main.cpp @@ -2549,8 +2549,14 @@ int _main() } MainWindow->Show(SW_NORMAL); + + + //------DO EVERYTHING run(); + + //------SHUTDOWN + KillDisplay(); SaveRecentRoms(); @@ -2559,12 +2565,12 @@ int _main() NDS_DeInit(); - //------SHUTDOWN - #ifdef DEBUG //LogStop(); #endif + timeKillEvent(hKeyInputTimer); + GInfo_DeInit(); SoundView_DlgClose();