Increase thoroughness of vehicle and YAPF cache desync debug checks.
This commit is contained in:
@@ -1289,6 +1289,7 @@ static void CheckCaches()
|
|||||||
VehicleCache *veh_cache = CallocT<VehicleCache>(length);
|
VehicleCache *veh_cache = CallocT<VehicleCache>(length);
|
||||||
GroundVehicleCache *gro_cache = CallocT<GroundVehicleCache>(length);
|
GroundVehicleCache *gro_cache = CallocT<GroundVehicleCache>(length);
|
||||||
TrainCache *tra_cache = CallocT<TrainCache>(length);
|
TrainCache *tra_cache = CallocT<TrainCache>(length);
|
||||||
|
Vehicle **veh_old = CallocT<Vehicle *>(length);
|
||||||
|
|
||||||
length = 0;
|
length = 0;
|
||||||
for (const Vehicle *u = v; u != NULL; u = u->Next()) {
|
for (const Vehicle *u = v; u != NULL; u = u->Next()) {
|
||||||
@@ -1299,11 +1300,17 @@ static void CheckCaches()
|
|||||||
case VEH_TRAIN:
|
case VEH_TRAIN:
|
||||||
gro_cache[length] = Train::From(u)->gcache;
|
gro_cache[length] = Train::From(u)->gcache;
|
||||||
tra_cache[length] = Train::From(u)->tcache;
|
tra_cache[length] = Train::From(u)->tcache;
|
||||||
|
veh_old[length] = CallocT<Train>(1);
|
||||||
|
MemCpyT((Train *) veh_old[length], Train::From(u));
|
||||||
break;
|
break;
|
||||||
case VEH_ROAD:
|
case VEH_ROAD:
|
||||||
gro_cache[length] = RoadVehicle::From(u)->gcache;
|
gro_cache[length] = RoadVehicle::From(u)->gcache;
|
||||||
|
veh_old[length] = CallocT<RoadVehicle>(1);
|
||||||
|
MemCpyT((RoadVehicle *) veh_old[length], RoadVehicle::From(u));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
veh_old[length] = CallocT<Vehicle>(1);
|
||||||
|
MemCpyT(veh_old[length], u);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
length++;
|
length++;
|
||||||
@@ -1326,6 +1333,30 @@ static void CheckCaches()
|
|||||||
if (memcmp(&veh_cache[length], &u->vcache, sizeof(VehicleCache)) != 0) {
|
if (memcmp(&veh_cache[length], &u->vcache, sizeof(VehicleCache)) != 0) {
|
||||||
DEBUG(desync, 2, "vehicle cache mismatch: type %i, vehicle %i, company %i, unit number %i, wagon %i", (int)v->type, v->index, (int)v->owner, v->unitnumber, length);
|
DEBUG(desync, 2, "vehicle cache mismatch: type %i, vehicle %i, company %i, unit number %i, wagon %i", (int)v->type, v->index, (int)v->owner, v->unitnumber, length);
|
||||||
}
|
}
|
||||||
|
if (veh_old[length]->acceleration != u->acceleration) {
|
||||||
|
DEBUG(desync, 2, "acceleration mismatch: vehicle %i, company %i, unit number %i, wagon %i", v->index, (int)v->owner, v->unitnumber, length);
|
||||||
|
}
|
||||||
|
if (veh_old[length]->breakdown_chance != u->breakdown_chance) {
|
||||||
|
DEBUG(desync, 2, "breakdown_chance mismatch: vehicle %i, company %i, unit number %i, wagon %i", v->index, (int)v->owner, v->unitnumber, length);
|
||||||
|
}
|
||||||
|
if (veh_old[length]->breakdown_ctr != u->breakdown_ctr) {
|
||||||
|
DEBUG(desync, 2, "breakdown_ctr mismatch: vehicle %i, company %i, unit number %i, wagon %i", v->index, (int)v->owner, v->unitnumber, length);
|
||||||
|
}
|
||||||
|
if (veh_old[length]->breakdown_delay != u->breakdown_delay) {
|
||||||
|
DEBUG(desync, 2, "breakdown_delay mismatch: vehicle %i, company %i, unit number %i, wagon %i", v->index, (int)v->owner, v->unitnumber, length);
|
||||||
|
}
|
||||||
|
if (veh_old[length]->breakdowns_since_last_service != u->breakdowns_since_last_service) {
|
||||||
|
DEBUG(desync, 2, "breakdowns_since_last_service mismatch: vehicle %i, company %i, unit number %i, wagon %i", v->index, (int)v->owner, v->unitnumber, length);
|
||||||
|
}
|
||||||
|
if (veh_old[length]->breakdown_severity != u->breakdown_severity) {
|
||||||
|
DEBUG(desync, 2, "breakdown_severity mismatch: vehicle %i, company %i, unit number %i, wagon %i", v->index, (int)v->owner, v->unitnumber, length);
|
||||||
|
}
|
||||||
|
if (veh_old[length]->breakdown_type != u->breakdown_type) {
|
||||||
|
DEBUG(desync, 2, "breakdown_type mismatch: vehicle %i, company %i, unit number %i, wagon %i", v->index, (int)v->owner, v->unitnumber, length);
|
||||||
|
}
|
||||||
|
if (veh_old[length]->vehicle_flags != u->vehicle_flags) {
|
||||||
|
DEBUG(desync, 2, "vehicle_flags mismatch: vehicle %i, company %i, unit number %i, wagon %i", v->index, (int)v->owner, v->unitnumber, length);
|
||||||
|
}
|
||||||
switch (u->type) {
|
switch (u->type) {
|
||||||
case VEH_TRAIN:
|
case VEH_TRAIN:
|
||||||
if (memcmp(&gro_cache[length], &Train::From(u)->gcache, sizeof(GroundVehicleCache)) != 0) {
|
if (memcmp(&gro_cache[length], &Train::From(u)->gcache, sizeof(GroundVehicleCache)) != 0) {
|
||||||
@@ -1334,6 +1365,15 @@ static void CheckCaches()
|
|||||||
if (memcmp(&tra_cache[length], &Train::From(u)->tcache, sizeof(TrainCache)) != 0) {
|
if (memcmp(&tra_cache[length], &Train::From(u)->tcache, sizeof(TrainCache)) != 0) {
|
||||||
DEBUG(desync, 2, "train cache mismatch: vehicle %i, company %i, unit number %i, wagon %i", v->index, (int)v->owner, v->unitnumber, length);
|
DEBUG(desync, 2, "train cache mismatch: vehicle %i, company %i, unit number %i, wagon %i", v->index, (int)v->owner, v->unitnumber, length);
|
||||||
}
|
}
|
||||||
|
if (Train::From(veh_old[length])->railtype != Train::From(u)->railtype) {
|
||||||
|
DEBUG(desync, 2, "railtype mismatch: vehicle %i, company %i, unit number %i, wagon %i", v->index, (int)v->owner, v->unitnumber, length);
|
||||||
|
}
|
||||||
|
if (Train::From(veh_old[length])->compatible_railtypes != Train::From(u)->compatible_railtypes) {
|
||||||
|
DEBUG(desync, 2, "compatible_railtypes mismatch: vehicle %i, company %i, unit number %i, wagon %i", v->index, (int)v->owner, v->unitnumber, length);
|
||||||
|
}
|
||||||
|
if (Train::From(veh_old[length])->flags != Train::From(u)->flags) {
|
||||||
|
DEBUG(desync, 2, "flags mismatch: vehicle %i, company %i, unit number %i, wagon %i", v->index, (int)v->owner, v->unitnumber, length);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case VEH_ROAD:
|
case VEH_ROAD:
|
||||||
if (memcmp(&gro_cache[length], &RoadVehicle::From(u)->gcache, sizeof(GroundVehicleCache)) != 0) {
|
if (memcmp(&gro_cache[length], &RoadVehicle::From(u)->gcache, sizeof(GroundVehicleCache)) != 0) {
|
||||||
@@ -1343,6 +1383,7 @@ static void CheckCaches()
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
free(veh_old[length]);
|
||||||
length++;
|
length++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1350,6 +1391,7 @@ static void CheckCaches()
|
|||||||
free(veh_cache);
|
free(veh_cache);
|
||||||
free(gro_cache);
|
free(gro_cache);
|
||||||
free(tra_cache);
|
free(tra_cache);
|
||||||
|
free(veh_old);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check whether the caches are still valid */
|
/* Check whether the caches are still valid */
|
||||||
|
@@ -185,6 +185,41 @@ public:
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void stDesyncCheck(Tpf &pf1, Tpf &pf2, const char *name, bool check_res)
|
||||||
|
{
|
||||||
|
Node *n1 = pf1.GetBestNode();
|
||||||
|
Node *n2 = pf2.GetBestNode();
|
||||||
|
uint depth = 0;
|
||||||
|
for (;;) {
|
||||||
|
if ((n1 != NULL) != (n2 != NULL)) {
|
||||||
|
DEBUG(desync, 2, "%s: node nonnull state at %u = [%d, %d]", name, depth, (n1 != NULL), (n2 != NULL));
|
||||||
|
DumpState(pf1, pf2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (n1 == NULL) break;
|
||||||
|
|
||||||
|
if (n1->GetTile() != n2->GetTile()) {
|
||||||
|
DEBUG(desync, 2, "%s tile mismatch at %u = [0x%X, 0x%X]", name, depth, n1->GetTile(), n2->GetTile());
|
||||||
|
DumpState(pf1, pf2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (n1->GetTrackdir() != n2->GetTrackdir()) {
|
||||||
|
DEBUG(desync, 2, "%s trackdir mismatch at %u = [0x%X, 0x%X]", name, depth, n1->GetTrackdir(), n2->GetTrackdir());
|
||||||
|
DumpState(pf1, pf2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
n1 = n1->m_parent;
|
||||||
|
n2 = n2->m_parent;
|
||||||
|
depth++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (check_res && (pf1.m_res_dest != pf2.m_res_dest || pf1.m_res_dest_td != pf2.m_res_dest_td)) {
|
||||||
|
DEBUG(desync, 2, "%s reservation target mismatch = [(0x%X, %d), (0x%X, %d)]", name, pf1.m_res_dest, pf1.m_res_dest_td, pf2.m_res_dest, pf2.m_res_dest_td);
|
||||||
|
DumpState(pf1, pf2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class Types>
|
template <class Types>
|
||||||
@@ -334,6 +369,8 @@ public:
|
|||||||
if (result1 != result2) {
|
if (result1 != result2) {
|
||||||
DEBUG(desync, 2, "CACHE ERROR: FindSafeTile() = [%s, %s]", result2 ? "T" : "F", result1 ? "T" : "F");
|
DEBUG(desync, 2, "CACHE ERROR: FindSafeTile() = [%s, %s]", result2 ? "T" : "F", result1 ? "T" : "F");
|
||||||
DumpState(pf1, pf2);
|
DumpState(pf1, pf2);
|
||||||
|
} else if (result1) {
|
||||||
|
CYapfFollowAnySafeTileRailT::stDesyncCheck(pf1, pf2, "CACHE ERROR: FindSafeTile()", true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -418,6 +455,8 @@ public:
|
|||||||
if (result1 != result2) {
|
if (result1 != result2) {
|
||||||
DEBUG(desync, 2, "CACHE ERROR: ChooseRailTrack() = [%d, %d]", result1, result2);
|
DEBUG(desync, 2, "CACHE ERROR: ChooseRailTrack() = [%d, %d]", result1, result2);
|
||||||
DumpState(pf1, pf2);
|
DumpState(pf1, pf2);
|
||||||
|
} else if (result1 != INVALID_TRACKDIR) {
|
||||||
|
CYapfFollowRailT::stDesyncCheck(pf1, pf2, "CACHE ERROR: ChooseRailTrack()", true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -476,6 +515,8 @@ public:
|
|||||||
if (result1 != result2) {
|
if (result1 != result2) {
|
||||||
DEBUG(desync, 2, "CACHE ERROR: CheckReverseTrain() = [%s, %s]", result1 ? "T" : "F", result2 ? "T" : "F");
|
DEBUG(desync, 2, "CACHE ERROR: CheckReverseTrain() = [%s, %s]", result1 ? "T" : "F", result2 ? "T" : "F");
|
||||||
DumpState(pf1, pf2);
|
DumpState(pf1, pf2);
|
||||||
|
} else if (result1) {
|
||||||
|
CYapfFollowRailT::stDesyncCheck(pf1, pf2, "CACHE ERROR: CheckReverseTrain()", false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user