4#include "Stroika/Frameworks/StroikaPreComp.h"
10#include "IdleManager.h"
13using namespace Stroika::Frameworks;
14using namespace Stroika::Frameworks::Led;
21void Idler::SpendIdleTime ()
30void EnterIdler::OnEnterIdle ()
40void IdleManager::AddIdler (Idler* idler)
43 Require (fIdlers.find (idler) == fIdlers.end ());
45 fIdlers.insert (map<Idler*, IdlerInfo>::value_type (idler, idlerInfo));
48void IdleManager::RemoveIdler (Idler* idler)
51 map<Idler*, IdlerInfo>::iterator i = fIdlers.find (idler);
52#if qBCCStaticVCLDTORLibBug
54 if (i == fIdlers.end ()) {
59 Require (i != fIdlers.end ());
60 Assert (i->first == idler);
64void IdleManager::AddEnterIdler (EnterIdler* enterIdler)
67 Require (find (fEnterIdlers.begin (), fEnterIdlers.end (), enterIdler) == fEnterIdlers.end ());
68 fEnterIdlers.push_back (enterIdler);
69 UpdateIdleMgrImplState ();
72void IdleManager::RemoveEnterIdler (EnterIdler* enterIdler)
75 vector<EnterIdler*>::iterator i = find (fEnterIdlers.begin (), fEnterIdlers.end (), enterIdler);
76 Require (i != fEnterIdlers.end ());
77 Assert (*i == enterIdler);
78 fEnterIdlers.erase (i);
79 UpdateIdleMgrImplState ();
85 map<Idler*, IdlerInfo>::iterator i = fIdlers.find (idler);
86 Require (i != fIdlers.end ());
87 Assert (i->first == idler);
88 return i->second.fIdlerFrequency;
94 map<Idler*, IdlerInfo>::iterator i = fIdlers.find (idler);
95 Require (i != fIdlers.end ());
96 Assert (i->first == idler);
97 if (i->second.fIdlerFrequency != idlerFrequency) {
98 i->second.fIdlerFrequency = idlerFrequency;
99 UpdateIdleMgrImplState ();
103void IdleManager::UpdateIdleMgrImplState ()
105 if (fIdleManagerOSImpl !=
nullptr) {
107 for (
auto i = fIdlers.begin (); i != fIdlers.end (); ++i) {
108 idleFreq = min (idleFreq, i->second.fIdlerFrequency);
110 if (not fEnterIdlers.empty ()) {
112 idleFreq = min (idleFreq, kMinEnterIdleFreqCheck);
114 bool shouldNeedIdleMgr = (idleFreq != kNeverCallIdler);
115 if (shouldNeedIdleMgr != fNeedMgrIdleCalls or (shouldNeedIdleMgr and idleFreq != fIdleManagerOSImpl->GetSuggestedFrequency ())) {
116 fNeedMgrIdleCalls = shouldNeedIdleMgr;
117 if (fNeedMgrIdleCalls) {
118 fIdleManagerOSImpl->SetSuggestedFrequency (idleFreq);
119 fIdleManagerOSImpl->StartSpendTimeCalls ();
122 fIdleManagerOSImpl->TerminateSpendTimeCalls ();
128void IdleManager::CallSpendTime ()
130 SetInIdleMode (
true);
132 for (
auto i = fIdlers.begin (); i != fIdlers.end (); ++i) {
134 if (i->second.fLastCalledAt + i->second.fIdlerFrequency <= now) {
135 Idler* idler = i->first;
136 idler->SpendIdleTime ();
137 now = Time::GetTickCount ();
138 i->second.fLastCalledAt = now;
143void IdleManager::CallEnterIdle ()
145 for (
auto i = fEnterIdlers.begin (); i != fEnterIdlers.end (); ++i) {
146 EnterIdler* enterIdler = *i;
148 enterIdler->OnEnterIdle ();
152void IdleManager::SetIdleManagerOSImpl (IdleManagerOSImpl* impl)
158 if (impl ==
nullptr) {
159 Get ().fIdleManagerOSImpl =
nullptr;
162 Get ().fIdleManagerOSImpl = impl;
171void IdleManager::IdleManagerOSImpl::CallSpendTime ()
173 IdleManager::Get ().CallSpendTime ();
#define RequireNotNull(p)
time_point< RealtimeClock, DurationSeconds > TimePointSeconds
TimePointSeconds is a simpler approach to chrono::time_point, which doesn't require using templates e...
chrono::duration< double > DurationSeconds
chrono::duration<double> - a time span (length of time) measured in seconds, but high precision.