void HangDetector() { while (keepRunning) { // increase multiplier during game load to prevent false positives e.g. during pathing const int hangTimeMultiplier = CrashHandler::gameLoading? 3 : 1; const spring_time hangtimeout = spring_msecs(spring_tomsecs(hangTimeout) * hangTimeMultiplier); spring_time curwdt = spring_gettime(); #if defined(USE_GML) && GML_ENABLE_SIM if (gmlMultiThreadSim) { spring_time cursimwdt = simwdt; if (spring_istime(cursimwdt) && curwdt > cursimwdt && (curwdt - cursimwdt) > hangtimeout) { HangHandler(true); simwdt = curwdt; } } #endif spring_time curdrawwdt = drawwdt; if (spring_istime(curdrawwdt) && curwdt > curdrawwdt && (curwdt - curdrawwdt) > hangtimeout) { HangHandler(false); drawwdt = curwdt; } spring_sleep(spring_secs(1)); } }
static void HangDetector() { while (!boost::this_thread::interruption_requested()) { { boost::shared_lock<boost::shared_mutex> lock(mutex); const spring_time curtime = spring_gettime(); for (ThreadsMap::iterator it=registeredThreads.begin(); it != registeredThreads.end(); ++it) { WatchDogThreadInfo& th_info = it->second; if (spring_istime(th_info.timer) && (curtime - th_info.timer) > hangTimeout) { HangHandler(th_info); th_info.timer = curtime; } } } boost::this_thread::sleep(boost::posix_time::seconds(1)); } }