BOOL WINAPI event_handler(DWORD sig) { switch (sig) { case CTRL_C_EVENT: case CTRL_CLOSE_EVENT: case CTRL_LOGOFF_EVENT: case CTRL_SHUTDOWN_EVENT: if (g_killed == false) { dstream<<DTIME<<"INFO: event_handler(): " <<"Ctrl+C, Close Event, Logoff Event or Shutdown Event, shutting down."<<std::endl; dstream<<DTIME<<"INFO: event_handler(): " <<"Printing debug stacks"<<std::endl; debug_stacks_print(); g_killed = true; }else{ (void)signal(SIGINT, SIG_DFL); } break; case CTRL_BREAK_EVENT: break; } return TRUE; }
void assert_fail(const char *assertion, const char *file, unsigned int line, const char *function) { DEBUGPRINT("\nIn thread %lx:\n" "%s:%d: %s: Assertion '%s' failed.\n", (unsigned long)get_current_thread_id(), file, line, function, assertion); debug_stacks_print(); if(g_debugstreams[1]) fclose(g_debugstreams[1]); abort(); }
void fatal_error_fn(const char *msg, const char *file, unsigned int line, const char *function) { DEBUGPRINT("\nIn thread %lx:\n" "%s:%u: %s: A fatal error occurred: %s\n", (unsigned long)get_current_thread_id(), file, line, function, msg); debug_stacks_print(); if(g_debugstreams[1]) fclose(g_debugstreams[1]); abort(); }
void sigint_handler(int sig) { if(g_killed == false) { dstream<<DTIME<<"INFO: sigint_handler(): " <<"Ctrl-C pressed, shutting down."<<std::endl; dstream<<DTIME<<"INFO: sigint_handler(): " <<"Printing debug stacks"<<std::endl; debug_stacks_print(); g_killed = true; } else { (void)signal(SIGINT, SIG_DFL); } }
void *EmergeThread::run() { DSTACK(FUNCTION_NAME); BEGIN_DEBUG_EXCEPTION_HANDLER v3s16 pos; m_map = (ServerMap *)&(m_server->m_env->getMap()); m_emerge = m_server->m_emerge; m_mapgen = m_emerge->m_mapgens[id]; enable_mapgen_debug_info = m_emerge->enable_mapgen_debug_info; reg("EmergeThread" + itos(id), 5); while (!stopRequested()) { try { std::map<v3s16, MapBlock *> modified_blocks; BlockEmergeData bedata; BlockMakeData bmdata; EmergeAction action; MapBlock *block; if (!popBlockEmerge(&pos, &bedata)) { m_queue_event.wait(); continue; } if (blockpos_over_limit(pos)) continue; bool allow_gen = bedata.flags & BLOCK_EMERGE_ALLOW_GEN; EMERGE_DBG_OUT("pos=" PP(pos) " allow_gen=" << allow_gen); action = getBlockOrStartGen(pos, allow_gen, &block, &bmdata); if (action == EMERGE_GENERATED) { { ScopeProfiler sp(g_profiler, "EmergeThread: Mapgen::makeChunk", SPT_AVG); TimeTaker t("mapgen::make_block()"); m_mapgen->makeChunk(&bmdata); if (enable_mapgen_debug_info == false) t.stop(true); // Hide output } block = finishGen(pos, &bmdata, &modified_blocks); } runCompletionCallbacks(pos, action, bedata.callbacks); if (block) { //modified_blocks[pos] = block; } else if (allow_gen) verbosestream<<"nothing generated at "<<pos<< " emerge action="<< action <<std::endl; if (modified_blocks.size() > 0) m_server->SetBlocksNotSent(/*modified_blocks*/); if (m_mapgen->heat_cache.size() > 1000) { m_mapgen->heat_cache.clear(); m_mapgen->humidity_cache.clear(); } } catch (VersionMismatchException &e) { std::ostringstream err; err << "World data version mismatch in MapBlock " << PP(pos) << std::endl << "----" << std::endl << "\"" << e.what() << "\"" << std::endl << "See debug.txt." << std::endl << "World probably saved by a newer version of " PROJECT_NAME_C "." << std::endl; debug_stacks_print(); m_server->setAsyncFatalError(err.str()); } catch (SerializationError &e) { std::ostringstream err; err << "Invalid data in MapBlock " << PP(pos) << std::endl << "----" << std::endl << "\"" << e.what() << "\"" << std::endl << "See debug.txt." << std::endl << "You can ignore this using [ignore_world_load_errors = true]." << std::endl; debug_stacks_print(); m_server->setAsyncFatalError(err.str()); } catch (std::exception &e) { errorstream << "emerge: exception at " << pos << " : " << e.what() << std::endl; } } END_DEBUG_EXCEPTION_HANDLER return NULL; }