From 206ec36c8e50a017636a70345b95f79feffb2446 Mon Sep 17 00:00:00 2001
From: kwolekr <mirrorisim@gmail.com>
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;
 }
-- 
GitLab