From 2e8f5dd9dde252e6eaa63422b033e587cde9dc32 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 2 Apr 2015 14:45:01 +0200 Subject: [PATCH] fixing locking issue in TrackedRaceImpl.getCurrentLeg(...) which could have lead to NPEs during course updates --- .../domain/tracking/impl/TrackedRaceImpl.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 60d244a0821..50d348a935a 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -1249,13 +1249,19 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl DummyMarkPassingWithTimePointOnly markPassingTimePoint = new DummyMarkPassingWithTimePointOnly(timePoint); TrackedLegOfCompetitor result = null; if (!competitorMarkPassings.isEmpty()) { - MarkPassing lastMarkPassingAtOfBeforeTimePoint = competitorMarkPassings.floor(markPassingTimePoint); - if (lastMarkPassingAtOfBeforeTimePoint != null) { - Waypoint waypointPassedLastAtOrBeforeTimePoint = lastMarkPassingAtOfBeforeTimePoint.getWaypoint(); - // don't return a leg if competitor has already finished last leg and therefore the race - if (waypointPassedLastAtOrBeforeTimePoint != getRace().getCourse().getLastWaypoint()) { - result = getTrackedLegStartingAt(waypointPassedLastAtOrBeforeTimePoint).getTrackedLeg(competitor); + final Course course = getRace().getCourse(); + course.lockForRead(); + try { + MarkPassing lastMarkPassingAtOfBeforeTimePoint = competitorMarkPassings.floor(markPassingTimePoint); + if (lastMarkPassingAtOfBeforeTimePoint != null) { + Waypoint waypointPassedLastAtOrBeforeTimePoint = lastMarkPassingAtOfBeforeTimePoint.getWaypoint(); + // don't return a leg if competitor has already finished last leg and therefore the race + if (waypointPassedLastAtOrBeforeTimePoint != course.getLastWaypoint()) { + result = getTrackedLegStartingAt(waypointPassedLastAtOrBeforeTimePoint).getTrackedLeg(competitor); + } } + } finally { + course.unlockAfterRead(); } } return result;