00001 // 00002 // Copyright (c) 2005-2008 Kenichi Watanabe. 00003 // Copyright (c) 2005-2008 Yasuhiro Watari. 00004 // Copyright (c) 2005-2008 Hironori Ichibayashi. 00005 // Copyright (c) 2008-2009 Kazuo Horio. 00006 // Copyright (c) 2009-2013 Naruki Kurata. 00007 // Copyright (c) 2005-2013 Ryota Shioya. 00008 // Copyright (c) 2005-2013 Masahiro Goshima. 00009 // 00010 // This software is provided 'as-is', without any express or implied 00011 // warranty. In no event will the authors be held liable for any damages 00012 // arising from the use of this software. 00013 // 00014 // Permission is granted to anyone to use this software for any purpose, 00015 // including commercial applications, and to alter it and redistribute it 00016 // freely, subject to the following restrictions: 00017 // 00018 // 1. The origin of this software must not be misrepresented; you must not 00019 // claim that you wrote the original software. If you use this software 00020 // in a product, an acknowledgment in the product documentation would be 00021 // appreciated but is not required. 00022 // 00023 // 2. Altered source versions must be plainly marked as such, and must not be 00024 // misrepresented as being the original software. 00025 // 00026 // 3. This notice may not be removed or altered from any source 00027 // distribution. 00028 // 00029 // 00030 00031 00032 #include <pch.h> 00033 00034 #include <utility> 00035 00036 #include "Env/Env.h" 00037 #include "Sim/Dumper/Dumper.h" 00038 00039 #include "Sim/Foundation/TimeWheel/TimeWheelBase.h" 00040 00041 using namespace std; 00042 using namespace Onikiri; 00043 00044 00045 TimeWheelBase::TimeWheelBase() : 00046 m_current(0), 00047 m_size(0), 00048 m_now(0) 00049 { 00050 LoadParam(); 00051 m_eventWheel.Resize( m_size ); 00052 } 00053 00054 TimeWheelBase::~TimeWheelBase() 00055 { 00056 ReleaseParam(); 00057 } 00058 00059 void TimeWheelBase::AddEvent( const ListNode& evnt, int time ) 00060 { 00061 ASSERT( 00062 ( GetCurrentPhase() == PHASE_UPDATE || 00063 GetCurrentPhase() == PHASE_END 00064 ), 00065 "AddEvent() can be called only in PHASE_PROCESS/END." 00066 ); 00067 ASSERT( time >= 0, "time is negative." ); 00068 ASSERT( m_size > time, "event list is not enough." ); 00069 00070 if( /*m_processedThisCycle &&*/ time == 0 ){ 00071 evnt->TriggerUpdate(); 00072 return; 00073 } 00074 00075 //ASSERT( !(time == 0 && m_processedThisCycle == true) , "event added after process."); 00076 00077 int id = IndexAfterTime( time ); 00078 m_eventWheel.GetEventList( id )->AddEvent( evnt ); 00079 } 00080 00081 00082 // Proceed a time tick 00083 void TimeWheelBase::Tick() 00084 { 00085 m_current++; 00086 if(m_current >= m_size){ 00087 m_current -= m_size; 00088 } 00089 ++m_now; 00090 } 00091 00092 00093 // Get time tick count. 00094 s64 TimeWheelBase::GetNow() const 00095 { 00096 ASSERT( 00097 ( GetCurrentPhase() == PHASE_UPDATE || 00098 GetCurrentPhase() == PHASE_END 00099 ), 00100 "GetNow() can be called only in PHASE_PROCESS/END." 00101 ); 00102 return m_now; 00103 } 00104 00105 // Process events. 00106 void TimeWheelBase::End() 00107 { 00108 if( !IsStalledThisCycle() ){ 00109 // Clear events 00110 int current = m_current; 00111 ListType* curEvent = m_eventWheel.PeekEventList(current); 00112 if( curEvent ){ 00113 curEvent->Clear(); 00114 m_eventWheel.ReleaseEventList( curEvent, current ); 00115 } 00116 } 00117 00118 ClockedResourceBase::End(); 00119 } 00120