From 91407b924ea47efdfe3a17fad5513189d5605288 Mon Sep 17 00:00:00 2001 From: fonsinchen Date: Wed, 29 Jan 2014 19:55:29 +0000 Subject: (svn r26286) -Fix: Thoroughly erase dead flows. --- src/linkgraph/linkgraphjob.cpp | 23 ++++++++++++++++++++--- src/linkgraph/linkgraphjob.h | 2 ++ src/station.cpp | 3 ++- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/linkgraph/linkgraphjob.cpp b/src/linkgraph/linkgraphjob.cpp index 717a7305d..318186d3f 100644 --- a/src/linkgraph/linkgraphjob.cpp +++ b/src/linkgraph/linkgraphjob.cpp @@ -34,6 +34,17 @@ LinkGraphJob::LinkGraphJob(const LinkGraph &orig) : { } +/** + * Erase all flows originating at a specific node. + * @param from Node to erase flows for. + */ +void LinkGraphJob::EraseFlows(NodeID from) +{ + for (NodeID node_id = 0; node_id < this->Size(); ++node_id) { + (*this)[node_id].Flows().erase(from); + } +} + /** * Join the link graph job and destroy it. */ @@ -52,14 +63,20 @@ LinkGraphJob::~LinkGraphJob() for (NodeID node_id = 0; node_id < size; ++node_id) { Node from = (*this)[node_id]; - /* The station can have been deleted. */ + /* The station can have been deleted. Remove all flows originating from it then. */ Station *st = Station::GetIfValid(from.Station()); - if (st == NULL) continue; + if (st == NULL) { + this->EraseFlows(node_id); + continue; + } /* Link graph merging and station deletion may change around IDs. Make * sure that everything is still consistent or ignore it otherwise. */ GoodsEntry &ge = st->goods[this->Cargo()]; - if (ge.link_graph != this->link_graph.index || ge.node != node_id) continue; + if (ge.link_graph != this->link_graph.index || ge.node != node_id) { + this->EraseFlows(node_id); + continue; + } LinkGraph *lg = LinkGraph::Get(ge.link_graph); FlowStatMap &flows = from.Flows(); diff --git a/src/linkgraph/linkgraphjob.h b/src/linkgraph/linkgraphjob.h index 66aff3672..f6979db74 100644 --- a/src/linkgraph/linkgraphjob.h +++ b/src/linkgraph/linkgraphjob.h @@ -64,6 +64,8 @@ protected: NodeAnnotationVector nodes; ///< Extra node data necessary for link graph calculation. EdgeAnnotationMatrix edges; ///< Extra edge data necessary for link graph calculation. + void EraseFlows(NodeID from); + public: /** diff --git a/src/station.cpp b/src/station.cpp index 0c7af914b..30723cc7b 100644 --- a/src/station.cpp +++ b/src/station.cpp @@ -99,8 +99,9 @@ Station::~Station() if (lg == NULL) continue; for (NodeID node = 0; node < lg->Size(); ++node) { + Station *st = Station::Get((*lg)[node].Station()); + st->goods[c].flows.erase(this->index); if ((*lg)[node][this->goods[c].node].LastUpdate() != INVALID_DATE) { - Station *st = Station::Get((*lg)[node].Station()); st->goods[c].flows.DeleteFlows(this->index); RerouteCargo(st, c, this->index, st->index); } -- cgit v1.2.3-54-g00ecf