Programmable pre-signals: Don't update dependencies when clearing programs

This commit is contained in:
Jonathan G Rennison
2020-09-01 22:04:39 +01:00
parent 825190db0c
commit 6be6f7436f

View File

@@ -17,6 +17,7 @@
#include "cmd_helper.h" #include "cmd_helper.h"
ProgramList _signal_programs; ProgramList _signal_programs;
bool _cleaning_signal_programs = false;
SignalProgram::SignalProgram(TileIndex tile, Track track, bool raw) SignalProgram::SignalProgram(TileIndex tile, Track track, bool raw)
{ {
@@ -188,6 +189,8 @@ void SignalSlotCondition::SetSlot(TraceRestrictSlotID slot_id)
/*virtual*/ SignalSlotCondition::~SignalSlotCondition() /*virtual*/ SignalSlotCondition::~SignalSlotCondition()
{ {
if (_cleaning_signal_programs) return;
if (this->IsSlotValid()) { if (this->IsSlotValid()) {
RemoveSignalSlotDependency(this->slot_id, this->this_sig); RemoveSignalSlotDependency(this->slot_id, this->this_sig);
} }
@@ -250,6 +253,8 @@ void SignalCounterCondition::SetCounter(TraceRestrictCounterID ctr_id)
/*virtual*/ SignalCounterCondition::~SignalCounterCondition() /*virtual*/ SignalCounterCondition::~SignalCounterCondition()
{ {
if (_cleaning_signal_programs) return;
if (this->IsCounterValid()) { if (this->IsCounterValid()) {
RemoveSignalCounterDependency(this->ctr_id, this->this_sig); RemoveSignalCounterDependency(this->ctr_id, this->this_sig);
} }
@@ -309,10 +314,13 @@ void SignalStateCondition::SetSignal(TileIndex tile, Trackdir track)
/*virtual*/ SignalStateCondition::~SignalStateCondition() /*virtual*/ SignalStateCondition::~SignalStateCondition()
{ {
if (this->IsSignalValid()) if (_cleaning_signal_programs) return;
if (this->IsSignalValid()) {
RemoveSignalDependency(SignalReference(this->sig_tile, TrackdirToTrack(sig_track)), RemoveSignalDependency(SignalReference(this->sig_tile, TrackdirToTrack(sig_track)),
this->this_sig); this->this_sig);
} }
}
/*virtual*/ bool SignalStateCondition::Evaluate(SignalVM& vm) /*virtual*/ bool SignalStateCondition::Evaluate(SignalVM& vm)
{ {
@@ -538,12 +546,14 @@ void FreeSignalProgram(SignalReference ref)
void FreeSignalPrograms() void FreeSignalPrograms()
{ {
_cleaning_signal_programs = true;
ProgramList::iterator i, e; ProgramList::iterator i, e;
for (i = _signal_programs.begin(), e = _signal_programs.end(); i != e;) { for (i = _signal_programs.begin(), e = _signal_programs.end(); i != e;) {
delete i->second; delete i->second;
// Must postincrement here to avoid iterator invalidation // Must postincrement here to avoid iterator invalidation
_signal_programs.erase(i++); _signal_programs.erase(i++);
} }
_cleaning_signal_programs = false;
} }
SignalState RunSignalProgram(SignalReference ref, uint num_exits, uint num_green) SignalState RunSignalProgram(SignalReference ref, uint num_exits, uint num_green)