Changeset - r20916:7557e3ac4ccb
[Not reviewed]
master
0 3 0
fonsinchen - 11 years ago 2013-11-10 15:18:49
fonsinchen@openttd.org
(svn r25963) -Fix [FS#5758]: Mixtures of old and new flows could create cycles.
3 files changed with 12 insertions and 3 deletions:
0 comments (0 inline, 0 general)
src/linkgraph/linkgraphjob.cpp
Show inline comments
 
@@ -72,7 +72,11 @@ LinkGraphJob::~LinkGraphJob()
 
					st2->goods[this->Cargo()].node != it->first ||
 
					(*lg)[node_id][it->first].LastUpdate() == INVALID_DATE) {
 
				/* Edge has been removed. Delete flows. */
 
				flows.DeleteFlows(to);
 
				StationIDStack erased = flows.DeleteFlows(to);
 
				/* Delete old flows for source stations which have been deleted
 
				 * from the new flows. This avoids flow cycles between old and
 
				 * new flows. */
 
				while (!erased.IsEmpty()) ge.flows.erase(erased.Pop());
 
			} else if ((*lg)[node_id][it->first].LastUnrestrictedUpdate() == INVALID_DATE) {
 
				/* Edge is fully restricted. */
 
				flows.RestrictFlows(to);
src/station_base.h
Show inline comments
 
@@ -148,7 +148,7 @@ class FlowStatMap : public std::map<Stat
 
public:
 
	void AddFlow(StationID origin, StationID via, uint amount);
 
	void PassOnFlow(StationID origin, StationID via, uint amount);
 
	void DeleteFlows(StationID via);
 
	StationIDStack DeleteFlows(StationID via);
 
	void RestrictFlows(StationID via);
 
	void ReleaseFlows(StationID via);
 
	void FinalizeLocalConsumption(StationID self);
src/station_cmd.cpp
Show inline comments
 
@@ -4352,18 +4352,23 @@ void FlowStatMap::FinalizeLocalConsumpti
 
/**
 
 * Delete all flows at a station for specific cargo and destination.
 
 * @param via Remote station of flows to be deleted.
 
 * @return IDs of source stations for which the complete FlowStat, not only a
 
 *         share, has been erased.
 
 */
 
void FlowStatMap::DeleteFlows(StationID via)
 
StationIDStack FlowStatMap::DeleteFlows(StationID via)
 
{
 
	StationIDStack ret;
 
	for (FlowStatMap::iterator f_it = this->begin(); f_it != this->end();) {
 
		FlowStat &s_flows = f_it->second;
 
		s_flows.ChangeShare(via, INT_MIN);
 
		if (s_flows.GetShares()->empty()) {
 
			ret.Push(f_it->first);
 
			this->erase(f_it++);
 
		} else {
 
			++f_it;
 
		}
 
	}
 
	return ret;
 
}
 

	
 
/**
0 comments (0 inline, 0 general)