projects
/
oweals
/
minetest.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
3b7a445
)
Fix EmergeThread hang on exit
author
kwolekr
<mirrorisim@gmail.com>
Fri, 15 Feb 2013 00:22:43 +0000
(19:22 -0500)
committer
kwolekr
<mirrorisim@gmail.com>
Tue, 26 Feb 2013 03:58:24 +0000
(22:58 -0500)
src/emerge.cpp
patch
|
blob
|
history
diff --git
a/src/emerge.cpp
b/src/emerge.cpp
index 82867be50245f240707ac963b63d169b02ca060e..e2b9e5a6c0d1f57699ab48f6ed007dc5f280bfee 100644
(file)
--- a/
src/emerge.cpp
+++ b/
src/emerge.cpp
@@
-56,6
+56,7
@@
EmergeManager::EmergeManager(IGameDef *gamedef, BiomeDefManager *bdef) {
EmergeManager::~EmergeManager() {
emergethread->setRun(false);
EmergeManager::~EmergeManager() {
emergethread->setRun(false);
+ emergethread->qevent.signal();
emergethread->stop();
delete emergethread;
emergethread->stop();
delete emergethread;
@@
-360,8
+361,11
@@
void *EmergeThread::Thread() {
while (getRun())
try {
while (getRun())
try {
- while (!emerge->popBlockEmerge(&p, &flags))
+ while (!emerge->popBlockEmerge(&p, &flags))
{
qevent.wait();
qevent.wait();
+ if (!getRun())
+ goto exit_emerge_loop;
+ }
last_tried_pos = p;
if (blockpos_over_limit(p))
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 "
//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_bloc
k (envlock)", SPT_AVG);
+ "
Mapgen::makeChun
k (envlock)", SPT_AVG);
map->finishBlockMake(&data, modified_blocks);
map->finishBlockMake(&data, modified_blocks);
@@
-465,6
+469,7
@@
void *EmergeThread::Thread() {
}
END_DEBUG_EXCEPTION_HANDLER(errorstream)
}
END_DEBUG_EXCEPTION_HANDLER(errorstream)
+exit_emerge_loop:
log_deregister_thread();
return NULL;
}
log_deregister_thread();
return NULL;
}