2021-12-09 15:22:19 -05:00
|
|
|
#include "Ee_IdleEvaluator.h"
|
|
|
|
|
|
|
|
using namespace Ee;
|
|
|
|
|
|
|
|
void CIdleEvaluator::Reset()
|
|
|
|
{
|
|
|
|
m_semaChecker.Reset();
|
|
|
|
m_selfThreadRotate.Reset();
|
|
|
|
m_threadRotateBounce.Reset();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool CIdleEvaluator::IsIdle() const
|
|
|
|
{
|
|
|
|
return m_semaChecker.m_isIdle ||
|
|
|
|
m_selfThreadRotate.m_isIdle ||
|
|
|
|
m_threadRotateBounce.m_isIdle;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CIdleEvaluator::NotifyEvent(EVENT eventType, uint32 arg0, uint32 arg1)
|
|
|
|
{
|
|
|
|
m_semaChecker.NotifyEvent(eventType, arg0, arg1);
|
|
|
|
m_selfThreadRotate.NotifyEvent(eventType, arg0, arg1);
|
|
|
|
m_threadRotateBounce.NotifyEvent(eventType, arg0, arg1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CIdleEvaluator::STRATEGY_SEMACHECKER::Reset()
|
|
|
|
{
|
|
|
|
m_lastWaitSema = -1;
|
|
|
|
m_lastSemaWaitCounter = 0;
|
|
|
|
m_isIdle = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CIdleEvaluator::STRATEGY_SEMACHECKER::NotifyEvent(EVENT eventType, uint32 arg0, uint32 arg1)
|
|
|
|
{
|
|
|
|
switch(eventType)
|
|
|
|
{
|
|
|
|
case EVENT_WAITSEMA:
|
|
|
|
case EVENT_SIGNALSEMA:
|
|
|
|
if(m_lastWaitSema == arg0)
|
|
|
|
{
|
|
|
|
m_lastSemaWaitCounter++;
|
|
|
|
if(m_lastSemaWaitCounter >= 100)
|
|
|
|
{
|
|
|
|
m_isIdle = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
m_lastSemaWaitCounter = 0;
|
|
|
|
m_isIdle = false;
|
|
|
|
}
|
|
|
|
m_lastWaitSema = arg0;
|
|
|
|
break;
|
2022-01-02 15:38:36 -05:00
|
|
|
case EVENT_INTERRUPT:
|
2021-12-09 15:22:19 -05:00
|
|
|
case EVENT_CHANGETHREAD:
|
|
|
|
m_lastSemaWaitCounter = 0;
|
|
|
|
m_lastWaitSema = -1;
|
|
|
|
m_isIdle = false;
|
|
|
|
break;
|
2023-05-02 08:56:25 -04:00
|
|
|
default:
|
|
|
|
break;
|
2021-12-09 15:22:19 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CIdleEvaluator::STRATEGY_SELFTHREADROTATE::Reset()
|
|
|
|
{
|
2021-12-17 13:53:17 -05:00
|
|
|
m_threadId = -1;
|
2021-12-09 15:22:19 -05:00
|
|
|
m_selfRotateThreadCount = 0;
|
|
|
|
m_isIdle = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CIdleEvaluator::STRATEGY_SELFTHREADROTATE::NotifyEvent(EVENT eventType, uint32 arg0, uint32 arg1)
|
|
|
|
{
|
|
|
|
switch(eventType)
|
|
|
|
{
|
|
|
|
case EVENT_ROTATETHREADREADYQUEUE:
|
|
|
|
if(arg0 == arg1)
|
|
|
|
{
|
|
|
|
m_selfRotateThreadCount++;
|
2021-12-17 13:53:17 -05:00
|
|
|
m_threadId = arg0;
|
2021-12-09 15:22:19 -05:00
|
|
|
if(m_selfRotateThreadCount > 500)
|
|
|
|
{
|
|
|
|
m_isIdle = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
2021-12-17 13:53:17 -05:00
|
|
|
{
|
|
|
|
m_selfRotateThreadCount = 0;
|
|
|
|
m_threadId = -1;
|
|
|
|
m_isIdle = false;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case EVENT_CHANGETHREAD:
|
|
|
|
if(arg0 != m_threadId)
|
2021-12-09 15:22:19 -05:00
|
|
|
{
|
|
|
|
m_selfRotateThreadCount = 0;
|
|
|
|
m_isIdle = false;
|
|
|
|
}
|
|
|
|
break;
|
2022-01-14 13:27:16 -05:00
|
|
|
case EVENT_INTERRUPT:
|
|
|
|
m_selfRotateThreadCount = 0;
|
|
|
|
m_isIdle = false;
|
|
|
|
break;
|
2023-05-02 08:56:25 -04:00
|
|
|
default:
|
|
|
|
break;
|
2021-12-09 15:22:19 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CIdleEvaluator::STRATEGY_THREADROTATEBOUNCE::Reset()
|
|
|
|
{
|
|
|
|
m_threadPairFirst = -1;
|
|
|
|
m_threadPairSecond = -1;
|
|
|
|
m_bounceCount = 0;
|
|
|
|
m_isIdle = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CIdleEvaluator::STRATEGY_THREADROTATEBOUNCE::NotifyEvent(EVENT eventType, uint32 arg0, uint32 arg1)
|
|
|
|
{
|
|
|
|
switch(eventType)
|
|
|
|
{
|
|
|
|
case EVENT_ROTATETHREADREADYQUEUE:
|
|
|
|
{
|
|
|
|
bool hasFirstThread = (arg0 == m_threadPairFirst) || (arg1 == m_threadPairFirst);
|
|
|
|
bool hasSecondThread = (arg0 == m_threadPairSecond) || (arg1 == m_threadPairSecond);
|
|
|
|
if(hasFirstThread && hasSecondThread)
|
|
|
|
{
|
|
|
|
m_bounceCount++;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
m_bounceCount = 0;
|
|
|
|
}
|
|
|
|
m_threadPairFirst = arg0;
|
|
|
|
m_threadPairSecond = arg1;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case EVENT_CHANGETHREAD:
|
|
|
|
if(arg0 != m_threadPairFirst && arg0 != m_threadPairSecond)
|
|
|
|
{
|
|
|
|
m_bounceCount = 0;
|
|
|
|
}
|
|
|
|
break;
|
2022-01-14 13:27:16 -05:00
|
|
|
case EVENT_INTERRUPT:
|
|
|
|
m_bounceCount = 0;
|
|
|
|
break;
|
2023-05-02 08:56:25 -04:00
|
|
|
default:
|
|
|
|
break;
|
2021-12-09 15:22:19 -05:00
|
|
|
}
|
|
|
|
m_isIdle = (m_bounceCount > 1000);
|
|
|
|
}
|