bool StatDumperThread::run() { int delay_ms = Config.MainConfig.GetIntDefault( "StatDumper", "Interval", 120000 ); if( delay_ms < 1000 ) delay_ms = 1000; int delay_s = delay_ms / 1000; if( !Config.MainConfig.GetString( "StatDumper", Filename, "Filename", "stats.xml", MAX_PATH ) ) strcpy( Filename, "stats.xml" ); #ifdef WIN32 memset( &m_OldPerfTime100nSec, 0, sizeof( m_OldPerfTime100nSec ) ); SYSTEM_INFO si; GetSystemInfo( &si ); number_of_cpus = si.dwNumberOfProcessors; #endif #ifdef WIN32 hEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); #else struct timeval now; struct timespec tv; pthread_mutex_init( &mutex, NULL ); pthread_cond_init( &cond, NULL ); #endif running = true; for(;;) { dumper.DumpStats(); #ifdef WIN32 WaitForSingleObject( hEvent, delay_ms ); #else gettimeofday( &now, NULL ); tv.tv_sec = now.tv_sec + delay_s; tv.tv_nsec = now.tv_usec * 1000; pthread_mutex_lock( &mutex ); pthread_cond_timedwait( &cond, &mutex, &tv ); pthread_mutex_unlock( &mutex ); #endif if( !running ) break; } return true; }
extern "C" SCRIPT_DECL void _exp_script_register(ScriptMgr* mgr) { //strcpy(Filename, Config.MainConfig.GetStringDefault("StatDumper.Filename", "stats.xml").c_str()); //strcpy(Filename, "stats.xml"); if(!Config.MainConfig.GetString("StatDumper", Filename, "Filename", "stats.xml", MAX_PATH)) strcpy(Filename, "stats.xml"); #ifdef WIN32 memset(&m_OldPerfTime100nSec, 0, sizeof(m_OldPerfTime100nSec)); SYSTEM_INFO si; GetSystemInfo(&si); number_of_cpus = si.dwNumberOfProcessors; #endif dumper.DumpStats(); int t = Config.MainConfig.GetIntDefault("StatDumper", "Interval", 120000); TimedEvent * te = TimedEvent::Allocate(&dumper, new CallbackP0<StatDumper>(&dumper, &StatDumper::DumpStats), 1, t, 0); sWorld.event_AddEvent(te); }