BVB Source Codes

CRYENGINE Show CallbackTimer.cpp Source code

Return Download CRYENGINE: download CallbackTimer.cpp Source code - Download CRYENGINE Source code - Type:.cpp
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. #include "StdAfx.h"
  4. #include "CallbackTimer.h"
  5.  
  6. #ifndef _RELEASE
  7.         #define EnsureMainThread()                                                                                   \
  8.           if (gEnv->mMainThreadId != CryGetCurrentThreadId()) {                                                      \
  9.             CryFatalError("%s called from invalid thread: %" PRI_THREADID "! Expected %" PRI_THREADID, __FUNCTION__, \
  10.                           CryGetCurrentThreadId(), gEnv->mMainThreadId); }
  11. #else
  12.         #define EnsureMainThread() (void)0
  13. #endif
  14.  
  15. const size_t MaxTimerCount = 256;
  16.  
  17. CallbackTimer::CallbackTimer()
  18.         : m_resort(false)
  19.         , m_timers(MaxTimerCount)
  20. {
  21. }
  22.  
  23. void CallbackTimer::Clear()
  24. {
  25.         m_resort = false;
  26.         Timeouts().swap(m_timeouts);
  27.         Timers(MaxTimerCount).swap(m_timers);
  28. }
  29.  
  30. void CallbackTimer::Update()
  31. {
  32.         if (!m_timeouts.empty())
  33.         {
  34.                 if (m_resort)
  35.                 {
  36.                         std::sort(m_timeouts.begin(), m_timeouts.end());
  37.                         m_resort = false;
  38.                 }
  39.  
  40.                 CTimeValue now = gEnv->pTimer->GetFrameStartTime();
  41.  
  42.                 while (!m_timeouts.empty() && (m_timeouts.front().timeout <= now))
  43.                 {
  44.                         TimeoutInfo timeout = m_timeouts.front();
  45.                         m_timeouts.pop_front();
  46.  
  47.                         TimerInfo timer = m_timers[timeout.timerID];
  48.  
  49.                         timer.callback(timer.userdata, timeout.timerID);
  50.  
  51.                         if (m_timers.validate(timeout.timerID))
  52.                         {
  53.                                 if (!timer.repeating)
  54.                                         m_timers.erase(timeout.timerID);
  55.                                 else
  56.                                 {
  57.                                         CTimeValue nextTimeout = timeout.timeout + timer.interval;
  58.                                         if (nextTimeout.GetValue() <= now.GetValue())
  59.                                                 nextTimeout.SetValue(now.GetValue() + 1);
  60.  
  61.                                         timeout.timeout = nextTimeout;
  62.                                         m_timeouts.push_back(timeout);
  63.                                         m_resort = true;
  64.                                 }
  65.                         }
  66.                 }
  67.         }
  68. }
  69.  
  70. CallbackTimer::TimerID CallbackTimer::AddTimer(CTimeValue interval, bool repeating, const Callback& callback, void* userdata)
  71. {
  72.         EnsureMainThread();
  73.  
  74.         CTimeValue now = gEnv->pTimer->GetFrameStartTime();
  75.  
  76.         if (m_timers.full())
  77.         {
  78.                 GameWarning("%s Maximum number of timers (%" PRISIZE_T ") exceeded!", __FUNCTION__, m_timers.capacity());
  79.                 m_timers.grow(8); // little growth to keep the warnings going - update MaxTimerCount if necessary
  80.         }
  81.  
  82.         TimerID timerID = m_timers.insert(TimerInfo(interval, repeating, callback, userdata));
  83.         m_timeouts.push_back(TimeoutInfo(now + interval, timerID));
  84.         m_resort = true;
  85.  
  86.         return timerID;
  87. }
  88.  
  89. void* CallbackTimer::RemoveTimer(TimerID timerID)
  90. {
  91.         EnsureMainThread();
  92.  
  93.         if (m_timers.validate(timerID))
  94.         {
  95.                 void* userdata = m_timers[timerID].userdata;
  96.                 m_timers.erase(timerID);
  97.  
  98.                 Timeouts::iterator it = m_timeouts.begin();
  99.                 Timeouts::iterator end = m_timeouts.end();
  100.  
  101.                 for (; it != end; ++it)
  102.                 {
  103.                         TimeoutInfo& timeout = *it;
  104.  
  105.                         if (timeout.timerID == timerID)
  106.                         {
  107.                                 std::swap(timeout, m_timeouts.front());
  108.                                 m_timeouts.pop_front();
  109.                                 m_resort = true;
  110.  
  111.                                 return userdata;
  112.                         }
  113.                 }
  114.         }
  115.  
  116.         return 0;
  117. }
  118.  
  119. void CallbackTimer::GetMemoryStatistics(ICrySizer* sizer)
  120. {
  121.         sizer->Add(*this);
  122.         sizer->Add(m_timers);
  123.         sizer->Add(m_timeouts);
  124. }
  125.  
downloadCallbackTimer.cpp Source code - Download CRYENGINE Source code
Related Source Codes/Software:
postal - 2017-06-11
reactide - Reactide is the first dedicated IDE for React web ... 2017-06-11
rkt - rkt is a pod-native container engine for Linux. It... 2017-06-11
uWebSockets - Tiny WebSockets https://for... 2017-06-11
realworld - TodoMVC for the RealWorld - Exemplary fullstack Me... 2017-06-11
CRYENGINE - CRYENGINE is a powerful real-time game development... 2017-06-11
goreplay - GoReplay is an open-source tool for capturing and ... 2017-06-10
pyenv - Simple Python version management 2017-06-10
redux-saga - An alternative side effect model for Redux apps ... 2017-06-10
angular-starter - 2017-06-10

 Back to top