changeset 7099:d9f437fa153d draft

(svn r10366) -Codechange [YAPF]: added DEBUG_YAPF_CACHE macro that (when set to 1) allows to track YAPF "cache errors". They are probably responsible for current MP desyncs. (thanks Rubidium for this great idea!). I will deal with those errors/desyncs tomorrow.
author KUDr <KUDr@openttd.org>
date Wed, 27 Jun 2007 22:29:57 +0000
parents 11dca9242a8d
children 3b7f7bb62dfc
files src/yapf/yapf_costrail.hpp src/yapf/yapf_rail.cpp
diffstat 2 files changed, 51 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/yapf/yapf_costrail.hpp
+++ b/src/yapf/yapf_costrail.hpp
@@ -55,6 +55,7 @@
 protected:
 	int           m_max_cost;
 	CBlobT<int>   m_sig_look_ahead_costs;
+	bool          m_disable_cache;
 
 public:
 	bool          m_stopped_on_first_two_way_signal;
@@ -64,6 +65,7 @@
 
 	CYapfCostRailT()
 		: m_max_cost(0)
+		, m_disable_cache(false)
 		, m_stopped_on_first_two_way_signal(false)
 	{
 		// pre-compute look-ahead penalties into array
@@ -468,7 +470,8 @@
 
 	FORCEINLINE bool CanUseGlobalCache(Node& n) const
 	{
-		return (n.m_parent != NULL)
+		return !m_disable_cache
+			&& (n.m_parent != NULL)
 			&& (n.m_parent->m_num_signals_passed >= m_sig_look_ahead_costs.Size());
 	}
 
@@ -481,6 +484,10 @@
 		}
 	}
 
+	void DisableCache(bool disable)
+	{
+		m_disable_cache = disable;
+	}
 };
 
 
--- a/src/yapf/yapf_rail.cpp
+++ b/src/yapf/yapf_rail.cpp
@@ -9,6 +9,8 @@
 #include "yapf_costrail.hpp"
 #include "yapf_destrail.hpp"
 
+#define DEBUG_YAPF_CACHE 0
+
 int _total_pf_time_us = 0;
 
 
@@ -44,8 +46,21 @@
 
 	static bool stFindNearestDepotTwoWay(Vehicle *v, TileIndex t1, Trackdir td1, TileIndex t2, Trackdir td2, int max_distance, int reverse_penalty, TileIndex* depot_tile, bool* reversed)
 	{
-		Tpf pf;
-		return pf.FindNearestDepotTwoWay(v, t1, td1, t2, td2, max_distance, reverse_penalty, depot_tile, reversed);
+		Tpf pf1;
+		bool result1 = pf1.FindNearestDepotTwoWay(v, t1, td1, t2, td2, max_distance, reverse_penalty, depot_tile, reversed);
+
+#if DEBUG_YAPF_CACHE
+		Tpf pf2;
+		TileIndex depot_tile2 = INVALID_TILE;
+		bool reversed2 = false;
+		pf2.DisableCache(true);
+		bool result2 = pf2.FindNearestDepotTwoWay(v, t1, td1, t2, td2, max_distance, reverse_penalty, &depot_tile2, &reversed2);
+		if (result1 != result2 || (result1 && (*depot_tile != depot_tile2 || *reversed != reversed2))) {
+			DEBUG(yapf, 0, "CACHE ERROR: FindNearestDepotTwoWay() = [%s, %s]", result1 ? "T" : "F", result2 ? "T" : "F");
+		}
+#endif
+
+		return result1;
 	}
 
 	FORCEINLINE bool FindNearestDepotTwoWay(Vehicle *v, TileIndex t1, Trackdir td1, TileIndex t2, Trackdir td2, int max_distance, int reverse_penalty, TileIndex* depot_tile, bool* reversed)
@@ -108,8 +123,19 @@
 	static Trackdir stChooseRailTrack(Vehicle *v, TileIndex tile, DiagDirection enterdir, TrackBits tracks, bool *path_not_found)
 	{
 		// create pathfinder instance
-		Tpf pf;
-		return pf.ChooseRailTrack(v, tile, enterdir, tracks, path_not_found);
+		Tpf pf1;
+		Trackdir result1 = pf1.ChooseRailTrack(v, tile, enterdir, tracks, path_not_found);
+
+#if DEBUG_YAPF_CACHE
+		Tpf pf2;
+		pf2.DisableCache(true);
+		Trackdir result2 = pf2.ChooseRailTrack(v, tile, enterdir, tracks, path_not_found);
+		if (result1 != result2) {
+			DEBUG(yapf, 0, "CACHE ERROR: ChooseRailTrack() = [%d, %d]", result1, result2);
+		}
+#endif
+
+		return result1;
 	}
 
 	FORCEINLINE Trackdir ChooseRailTrack(Vehicle *v, TileIndex tile, DiagDirection enterdir, TrackBits tracks, bool *path_not_found)
@@ -147,8 +173,19 @@
 
 	static bool stCheckReverseTrain(Vehicle* v, TileIndex t1, Trackdir td1, TileIndex t2, Trackdir td2)
 	{
-		Tpf pf;
-		return pf.CheckReverseTrain(v, t1, td1, t2, td2);
+		Tpf pf1;
+		bool result1 = pf1.CheckReverseTrain(v, t1, td1, t2, td2);
+
+#if DEBUG_YAPF_CACHE
+		Tpf pf2;
+		pf2.DisableCache(true);
+		bool result2 = pf2.CheckReverseTrain(v, t1, td1, t2, td2);
+		if (result1 != result2) {
+			DEBUG(yapf, 0, "CACHE ERROR: CheckReverseTrain() = [%s, %s]", result1 ? "T" : "F", result2 ? "T" : "F");
+		}
+#endif
+
+		return result1;
 	}
 
 	FORCEINLINE bool CheckReverseTrain(Vehicle* v, TileIndex t1, Trackdir td1, TileIndex t2, Trackdir td2)