Changeset - r20409:7af3404f1664
[Not reviewed]
master
0 3 0
fonsinchen - 11 years ago 2013-06-17 20:38:11
fonsinchen@openttd.org
(svn r25424) -Fix: keep old flows around in an invalidated state to continue routing cargo if necessary
3 files changed with 39 insertions and 2 deletions:
0 comments (0 inline, 0 general)
src/linkgraph/linkgraphjob.cpp
Show inline comments
 
@@ -72,7 +72,19 @@ LinkGraphJob::~LinkGraphJob()
 
			}
 
		}
 

	
 
		ge.flows.swap(flows);
 
		/* Swap shares and invalidate ones that are completely deleted. Don't
 
		 * really delete them as we could then end up with unroutable cargo
 
		 * somewhere. */
 
		for (FlowStatMap::iterator it(ge.flows.begin()); it != ge.flows.end(); ++it) {
 
			FlowStatMap::iterator new_it = flows.find(it->first);
 
			if (new_it == flows.end()) {
 
				it->second.Invalidate();
 
			} else {
 
				it->second.SwapShares(new_it->second);
 
				flows.erase(new_it);
 
			}
 
		}
 
		ge.flows.insert(flows.begin(), flows.end());
 
		InvalidateWindowData(WC_STATION_VIEW, st->index, this->Cargo());
 
	}
 
}
src/station_base.h
Show inline comments
 
@@ -80,6 +80,13 @@ public:
 
	inline const SharesMap *GetShares() const { return &this->shares; }
 

	
 
	/**
 
	 * Swap the shares maps, and thus the content of this FlowStat with the
 
	 * other one.
 
	 * @param other FlowStat to swap with.
 
	 */
 
	inline void SwapShares(FlowStat &other) { this->shares.swap(other.shares); }
 

	
 
	/**
 
	 * Get a station a package can be routed to. This done by drawing a
 
	 * random number between 0 and sum_shares and then looking that up in
 
	 * the map with lower_bound. So each share gets selected with a
 
@@ -94,6 +101,8 @@ public:
 

	
 
	StationID GetVia(StationID excluded, StationID excluded2 = INVALID_STATION) const;
 

	
 
	void Invalidate();
 

	
 
private:
 
	SharesMap shares;  ///< Shares of flow to be sent via specified station (or consumed locally).
 
};
src/station_cmd.cpp
Show inline comments
 
@@ -4086,7 +4086,23 @@ StationID FlowStat::GetVia(StationID exc
 
	}
 
	assert(it3 != this->shares.end());
 
	return it3->second;
 

	
 
}
 

	
 
/**
 
 * Reduce all flows to minimum capacity so that they don't get in the way of
 
 * link usage statistics too much. Keep them around, though, to continue
 
 * routing any remaining cargo.
 
 */
 
void FlowStat::Invalidate()
 
{
 
	assert(!this->shares.empty());
 
	SharesMap new_shares;
 
	uint i = 0;
 
	for (SharesMap::iterator it(this->shares.begin()); it != this->shares.end(); ++it) {
 
		new_shares[++i] = it->second;
 
	}
 
	this->shares.swap(new_shares);
 
	assert(!this->shares.empty());
 
}
 

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