bug5959: CourseChangeBasedTrackApproximation objects lazily on demand

This commit is contained in:
Axel Uhl committed 2025-12-08 18:01:32 +01:00
1 parent 16213b12d3
commit 2e6dc7930d
1 file changed
+5 -4
@@ -350,7 +350,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
* maintain state to accelerate the {@link #approximate(Competitor, Distance, TimePoint, TimePoint)} method, also in
* live scenarios when the contents of the competitors' {@link #tracks} changes dynamically.
*/
private final Map<Competitor, CourseChangeBasedTrackApproximation> maneuverApproximators;
private final ConcurrentMap<Competitor, CourseChangeBasedTrackApproximation> maneuverApproximators;
private transient ConcurrentMap<TimePoint, Future<Wind>> directionFromStartToNextMarkCache;
@@ -585,12 +585,11 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
}
markPassingsForCompetitor = new HashMap<>();
tracks = new HashMap<>();
maneuverApproximators = new HashMap<>();
maneuverApproximators = new ConcurrentHashMap<>();
for (Competitor competitor : race.getCompetitors()) {
markPassingsForCompetitor.put(competitor, new ConcurrentSkipListSet<MarkPassing>(MarkPassingByTimeComparator.INSTANCE));
final DynamicGPSFixMovingTrackImpl<Competitor> track = new DynamicGPSFixMovingTrackImpl<Competitor>(competitor, millisecondsOverWhichToAverageSpeed);
tracks.put(competitor, track);
maneuverApproximators.put(competitor, new CourseChangeBasedTrackApproximation(track, race.getBoatOfCompetitor(competitor).getBoatClass()));
}
markPassingsForWaypoint = new ConcurrentHashMap<Waypoint, NavigableSet<MarkPassing>>();
for (Waypoint waypoint : race.getCourse().getWaypoints()) {
@@ -2863,7 +2862,9 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
@Override
public Iterable<GPSFixMoving> approximate(Competitor competitor, Distance maxDistance, TimePoint from, TimePoint to) {
return maneuverApproximators.get(competitor).approximate(from, to);
return maneuverApproximators.computeIfAbsent(competitor,
c->new CourseChangeBasedTrackApproximation(getTrack(c), race.getBoatOfCompetitor(c).getBoatClass()))
.approximate(from, to);
}
private void ensureManeuverCacheIsFilledForAllCompetitors() {