(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!).
authorKUDr
Wed, 27 Jun 2007 22:29:57 +0000
changeset 7099 a1d7e197cb64
parent 7098 02887279c5fe
child 7100 a4dd8e1b9f6e
(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.
src/yapf/yapf_costrail.hpp
src/yapf/yapf_rail.cpp
--- a/src/yapf/yapf_costrail.hpp	Wed Jun 27 22:26:27 2007 +0000
+++ b/src/yapf/yapf_costrail.hpp	Wed Jun 27 22:29:57 2007 +0000
@@ -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	Wed Jun 27 22:26:27 2007 +0000
+++ b/src/yapf/yapf_rail.cpp	Wed Jun 27 22:29:57 2007 +0000
@@ -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)