From 4086edbfae9a04da491cdb349a3bef6af5c132d9 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Fri, 15 Feb 2013 10:56:56 +0200 Subject: [PATCH] Rearrange block reservations to present consistent state in signal_reserved --- source/libr2c2/train.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/source/libr2c2/train.cpp b/source/libr2c2/train.cpp index 936f74a..599f2dc 100644 --- a/source/libr2c2/train.cpp +++ b/source/libr2c2/train.cpp @@ -430,10 +430,13 @@ void Train::place(Block &block, unsigned entry) set_active(false); accurate_position = false; + blocks.push_back(BlockIter(&block, entry)); if(!block.reserve(this)) + { + blocks.pop_back(); return; + } - blocks.push_back(BlockIter(&block, entry)); if(reverse) { TrackIter track = BlockIter(&block, entry).reverse().track_iter(); @@ -648,8 +651,9 @@ void Train::tick(const Time::TimeStamp &t, const Time::TimeDelta &dt) if(dist>10*layout.get_catalogue().get_scale()) { - blocks.front()->reserve(0); + Block &block = *blocks.front(); blocks.pop_front(); + block.reserve(0); } } } @@ -967,9 +971,11 @@ void Train::reserve_more() } } + blocks.push_back(block); bool reserved = block->reserve(this); if(!reserved) { + blocks.pop_back(); /* We've found another train. If it wants to exit the block from the same endpoint we're trying to enter from or the other way around, treat it as coming towards us. Otherwise treat it as going in the @@ -1000,7 +1006,11 @@ void Train::reserve_more() /* Ask a lesser priority train going to the same direction to free the block for us */ if(other_train->free_block(*block)) - reserved = block->reserve(this); + { + blocks.push_back(block); + if(!(reserved = block->reserve(this))) + blocks.pop_back(); + } } else if(other_train!=yielding_to && (other_prioreserve(&obj); obj.blocks.push_back(BlockIter(blk, entry)); + blk->reserve(&obj); if(blk->get_sensor_id()) obj.layout.get_driver().set_sensor(blk->get_sensor_id(), true); -- 2.43.0