Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions engine/sim/event.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
event_t::event_t( sim_t& s, actor_t* a )
: _sim( s ),
next( nullptr ),
time( timespan_t::zero() ),
reschedule_time( timespan_t::zero() ),
time( 0_ms ),
reschedule_time( no_reschedule ),
id( 0 ),
canceled( false ),
recycled( false ),
Expand Down Expand Up @@ -48,11 +48,12 @@ void* event_t::operator new( std::size_t size, sim_t& sim )

void event_t::reschedule( timespan_t delta_time )
{
id = ++_sim.event_mgr.global_event_id;
delta_time += _sim.event_mgr.current_time;

if ( _sim.debug )
{
if ( reschedule_time == timespan_t::zero() )
if ( reschedule_time == no_reschedule )
{
_sim.print_debug("Rescheduling event {} from {} to {}",
*this, time, delta_time );
Expand Down
4 changes: 3 additions & 1 deletion engine/sim/event.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ constexpr unsigned next_power_of_two( unsigned v )
// (4) create events through make_event method
struct event_t : private noncopyable
{
static constexpr timespan_t no_reschedule = -1_ms;

sim_t& _sim;
event_t* next;
timespan_t time;
Expand All @@ -70,7 +72,7 @@ struct event_t : private noncopyable
schedule( delta_time );
}

timespan_t occurs() const { return ( reschedule_time != timespan_t::zero() ) ? reschedule_time : time; }
timespan_t occurs() const { return ( reschedule_time != no_reschedule ) ? reschedule_time : time; }
timespan_t remains() const;

void schedule( timespan_t delta_time );
Expand Down
25 changes: 14 additions & 11 deletions engine/sim/event_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,16 @@ event_manager_t::event_manager_t( sim_t* s )
total_events_processed( 0 ),
max_events_remaining( 0 ),
timing_slice( 0 ),
global_event_id( 1 ), // start at 1, so we can identify event -> id == 0
// meaning a unscheduled event.
global_event_id( 0 ), // event->id == 0 represents an unscheduled event,
// make sure to use preincrement when assigning event ids
timing_wheel(),
recycled_event_list( nullptr ),
wheel_seconds( 0 ),
wheel_size( 0 ),
wheel_mask( 0 ),
wheel_shift( 5 ),
wheel_granularity( 0.0 ),
wheel_time( timespan_t::zero() ),
wheel_time( 0_ms ),
event_stopwatch(),
#ifndef NDEBUG
max_events( 0U ),
Expand Down Expand Up @@ -114,20 +114,21 @@ void event_manager_t::recycle_event( event_t* e )
void event_manager_t::add_event( event_t* e, timespan_t delta_time )
{
assert( e -> next == nullptr );
e->id = ++global_event_id;
if ( e->id == 0 )
e->id = ++global_event_id;

if ( delta_time < timespan_t::zero() )
delta_time = timespan_t::zero();
if ( delta_time < 0_ms )
delta_time = 0_ms;

if ( delta_time > wheel_time )
{
e->time = current_time + wheel_time - timespan_t::from_seconds( 1 );
e->time = current_time + wheel_time - 1_s;
e->reschedule_time = current_time + delta_time;
}
else
{
e->time = current_time + delta_time;
e->reschedule_time = timespan_t::zero();
e->reschedule_time = event_t::no_reschedule;
}

// Determine the timing wheel position to which the event will belong
Expand All @@ -141,8 +142,10 @@ void event_manager_t::add_event( event_t* e, timespan_t delta_time )
unsigned traversed = 0;
#endif

// Find the first event p (= *prev) for which (p->time, p->id) > (e->time, e->id)
while ( ( *prev ) &&
( *prev )->time <= e->time ) // Find position in the list
( ( *prev )->time < e->time ||
( ( *prev )->time == e->time && ( *prev )->id <= e->id ) ) )
{
prev = &( ( *prev )->next );
#ifdef EVENT_QUEUE_DEBUG
Expand Down Expand Up @@ -256,7 +259,7 @@ bool event_manager_t::execute()
{
sim->print_debug( "Canceled event: {}", *e );
}
else if ( e->reschedule_time > e->time )
else if ( e->reschedule_time != event_t::no_reschedule )
{
reschedule_event( e );
continue;
Expand Down Expand Up @@ -394,7 +397,7 @@ void event_manager_t::reset()
timing_slice = 0;
global_event_id = 0;
canceled = false;
current_time = timespan_t::zero();
current_time = 0_ms;
}

// event_manager_t::merge ===================================================
Expand Down
Loading