2e6dc7930d44834d26c65b81ca9e8f394bf68bce
java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java
| ... | ... | @@ -350,7 +350,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl |
| 350 | 350 | * maintain state to accelerate the {@link #approximate(Competitor, Distance, TimePoint, TimePoint)} method, also in |
| 351 | 351 | * live scenarios when the contents of the competitors' {@link #tracks} changes dynamically. |
| 352 | 352 | */ |
| 353 | - private final Map<Competitor, CourseChangeBasedTrackApproximation> maneuverApproximators; |
|
| 353 | + private final ConcurrentMap<Competitor, CourseChangeBasedTrackApproximation> maneuverApproximators; |
|
| 354 | 354 | |
| 355 | 355 | private transient ConcurrentMap<TimePoint, Future<Wind>> directionFromStartToNextMarkCache; |
| 356 | 356 | |
| ... | ... | @@ -585,12 +585,11 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl |
| 585 | 585 | } |
| 586 | 586 | markPassingsForCompetitor = new HashMap<>(); |
| 587 | 587 | tracks = new HashMap<>(); |
| 588 | - maneuverApproximators = new HashMap<>(); |
|
| 588 | + maneuverApproximators = new ConcurrentHashMap<>(); |
|
| 589 | 589 | for (Competitor competitor : race.getCompetitors()) { |
| 590 | 590 | markPassingsForCompetitor.put(competitor, new ConcurrentSkipListSet<MarkPassing>(MarkPassingByTimeComparator.INSTANCE)); |
| 591 | 591 | final DynamicGPSFixMovingTrackImpl<Competitor> track = new DynamicGPSFixMovingTrackImpl<Competitor>(competitor, millisecondsOverWhichToAverageSpeed); |
| 592 | 592 | tracks.put(competitor, track); |
| 593 | - maneuverApproximators.put(competitor, new CourseChangeBasedTrackApproximation(track, race.getBoatOfCompetitor(competitor).getBoatClass())); |
|
| 594 | 593 | } |
| 595 | 594 | markPassingsForWaypoint = new ConcurrentHashMap<Waypoint, NavigableSet<MarkPassing>>(); |
| 596 | 595 | for (Waypoint waypoint : race.getCourse().getWaypoints()) { |
| ... | ... | @@ -2863,7 +2862,9 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl |
| 2863 | 2862 | |
| 2864 | 2863 | @Override |
| 2865 | 2864 | public Iterable<GPSFixMoving> approximate(Competitor competitor, Distance maxDistance, TimePoint from, TimePoint to) { |
| 2866 | - return maneuverApproximators.get(competitor).approximate(from, to); |
|
| 2865 | + return maneuverApproximators.computeIfAbsent(competitor, |
|
| 2866 | + c->new CourseChangeBasedTrackApproximation(getTrack(c), race.getBoatOfCompetitor(c).getBoatClass())) |
|
| 2867 | + .approximate(from, to); |
|
| 2867 | 2868 | } |
| 2868 | 2869 | |
| 2869 | 2870 | private void ensureManeuverCacheIsFilledForAllCompetitors() { |