Fix EmergeThread hang on exit
authorkwolekr <mirrorisim@gmail.com>
Fri, 15 Feb 2013 00:22:43 +0000 (19:22 -0500)
committerkwolekr <mirrorisim@gmail.com>
Tue, 26 Feb 2013 03:58:24 +0000 (22:58 -0500)
src/emerge.cpp

index 82867be50245f240707ac963b63d169b02ca060e..e2b9e5a6c0d1f57699ab48f6ed007dc5f280bfee 100644 (file)
@@ -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;
 }