]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/blockallocator.cpp
Avoid nested block reservations completely
[r2c2.git] / source / libr2c2 / blockallocator.cpp
index 7cca79f795a61c9cad6ad11eb2689639f4574098..cb6b912de53481552990bb5f76936bf5ee801778 100644 (file)
@@ -34,7 +34,8 @@ BlockAllocator::BlockAllocator(Train &t):
        pending_block(0),
        stop_at_block(0),
        reserving(false),
-       advancing(false)
+       advancing(false),
+       reserve_pending(false)
 {
        Layout &layout = train.get_layout();
        layout.signal_block_reserved.connect(sigc::mem_fun(this, &BlockAllocator::block_reserved));
@@ -59,6 +60,7 @@ void BlockAllocator::set_active(bool a)
        {
                release_blocks_end(cur_blocks_end);
                pending_block = 0;
+               reserve_pending = false;
        }
 }
 
@@ -186,6 +188,15 @@ bool BlockAllocator::is_block_current(const Block &block) const
        return find_if(blocks.begin(), end, BlockMatch(block))!=cur_blocks_end;
 }
 
+void BlockAllocator::tick()
+{
+       if(reserve_pending)
+       {
+               reserve_pending = false;
+               reserve_more();
+       }
+}
+
 void BlockAllocator::reserve_more()
 {
        if(blocks.empty())
@@ -483,13 +494,13 @@ void BlockAllocator::turnout_path_changing(Track &track)
 void BlockAllocator::turnout_path_changed(Track &track)
 {
        if(&track.get_block()==pending_block && !reserving)
-               reserve_more();
+               reserve_pending = true;
 }
 
 void BlockAllocator::block_reserved(Block &block, const Train *tr)
 {
        if(&block==pending_block && !tr && !reserving)
-               reserve_more();
+               reserve_pending = true;
 }
 
 void BlockAllocator::sensor_state_changed(Sensor &sensor, Sensor::State state)
@@ -508,7 +519,7 @@ void BlockAllocator::sensor_state_changed(Sensor &sensor, Sensor::State state)
                        advance_front(next_sensor);
 
                        if(active)
-                               reserve_more();
+                               reserve_pending = true;
                }
                else if(!is_block_current(*block))
                        train.get_layout().emergency(block, "Sensor for "+train.get_name()+" triggered out of order");