int KGameserverEyes::Active() { KEyes::Active(); DoPing(g_cOrpgWorld.m_dwLogicFrames); DoSendCustomInfo(g_cOrpgWorld.m_dwLogicFrames); DoSendPlayerCount(g_cOrpgWorld.m_dwLogicFrames); //DoSendMapInfo(g_cOrpgWorld.m_dwLogicFrames); return 1; }
void BaseResource::Ping() { BaseJob *job; // Don't start a new ping too soon after the previous one. If the // resource is up, the minimum time between pings is probeDelay. If the // resource is down, the minimum time between pings is probeInterval. int delay; if ( resourceDown == false ) { delay = (lastPing + probeDelay) - time(NULL); } else { delay = (lastPing + probeInterval) - time(NULL); } if ( delay > 0 ) { daemonCore->Reset_Timer( pingTimerId, delay ); return; } daemonCore->Reset_Timer( pingTimerId, TIMER_NEVER ); unsigned ping_delay; bool ping_complete; bool ping_succeeded; DoPing( ping_delay, ping_complete, ping_succeeded ); if ( ping_delay ) { daemonCore->Reset_Timer( pingTimerId, ping_delay ); return; } if ( !ping_complete ) { pingActive = true; return; } pingActive = false; lastPing = time(NULL); if ( ping_succeeded != resourceDown && firstPingDone == true ) { // State of resource hasn't changed. Notify ping requesters only. dprintf(D_ALWAYS,"resource %s is still %s\n",resourceName, ping_succeeded?"up":"down"); pingRequesters.Rewind(); while ( pingRequesters.Next( job ) ) { pingRequesters.DeleteCurrent(); if ( resourceDown ) { job->NotifyResourceDown(); } else { job->NotifyResourceUp(); } } } else { // State of resource has changed. Notify every job. dprintf(D_ALWAYS,"resource %s is now %s\n",resourceName, ping_succeeded?"up":"down"); resourceDown = !ping_succeeded; lastStatusChange = lastPing; firstPingDone = true; registeredJobs.Rewind(); while ( registeredJobs.Next( job ) ) { if ( resourceDown ) { job->NotifyResourceDown(); } else { job->NotifyResourceUp(); } } pingRequesters.Rewind(); while ( pingRequesters.Next( job ) ) { pingRequesters.DeleteCurrent(); } } if ( resourceDown ) { daemonCore->Reset_Timer( pingTimerId, probeInterval ); } }