From 206ec36c8e50a017636a70345b95f79feffb2446 Mon Sep 17 00:00:00 2001 From: kwolekr Date: Thu, 14 Feb 2013 19:22:43 -0500 Subject: [PATCH] Fix EmergeThread hang on exit --- src/emerge.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/emerge.cpp b/src/emerge.cpp index 82867be50..e2b9e5a6c 100644 --- a/src/emerge.cpp +++ b/src/emerge.cpp @@ -56,6 +56,7 @@ EmergeManager::EmergeManager(IGameDef *gamedef, BiomeDefManager *bdef) { EmergeManager::~EmergeManager() { emergethread->setRun(false); + emergethread->qevent.signal(); emergethread->stop(); delete emergethread; @@ -360,8 +361,11 @@ void *EmergeThread::Thread() { while (getRun()) try { - while (!emerge->popBlockEmerge(&p, &flags)) + while (!emerge->popBlockEmerge(&p, &flags)) { qevent.wait(); + if (!getRun()) + goto exit_emerge_loop; + } last_tried_pos = p; if (blockpos_over_limit(p)) @@ -393,7 +397,7 @@ void *EmergeThread::Thread() { //envlock: usually 0ms, but can take either 30 or 400ms to acquire JMutexAutoLock envlock(m_server->m_env_mutex); ScopeProfiler sp(g_profiler, "EmergeThread: after " - "mapgen::make_block (envlock)", SPT_AVG); + "Mapgen::makeChunk (envlock)", SPT_AVG); map->finishBlockMake(&data, modified_blocks); @@ -465,6 +469,7 @@ void *EmergeThread::Thread() { } END_DEBUG_EXCEPTION_HANDLER(errorstream) +exit_emerge_loop: log_deregister_thread(); return NULL; }