Bugfix: prevent race condition in TrackPointCreator.

This race condition leads to a crash in TrackStatisticsUpdater as the time might appear to move backwards if the created TrackPoints are not stored in order. Might happen if multiple sensors (BLE or GPS) are used in simultaneously.

Every method affected by a race condition is now synchronized.

Problem was introduced in c4b8082efc

Fixes #1151.
This commit is contained in:
Dennis Guse
2022-04-03 12:28:15 +02:00
parent 71288cd9be
commit 18b21a6a3e
5 changed files with 38 additions and 24 deletions
@@ -469,7 +469,7 @@ public class ExportImportTest {
return sensorDataSet;
}
});
trackPointCreator.onChange(null);
trackPointCreator.onChange(new SensorDataSet());
}
private void mockAltitudeChange(TrackPointCreator trackPointCreator, float altitudeGain) {
@@ -22,7 +22,6 @@ import org.mockito.junit.MockitoJUnitRunner;
import java.time.Instant;
import de.dennisguse.opentracks.data.models.Distance;
import de.dennisguse.opentracks.data.models.TrackPoint;
import de.dennisguse.opentracks.settings.PreferencesUtils;
@RunWith(MockitoJUnitRunner.class)
@@ -62,7 +61,7 @@ public class GPSHandlerTest {
locationHandler.onLocationChanged(createLocation(45f, 35f, 3, 5, System.currentTimeMillis()));
// then
verify(trackPointCreator, times(1)).onNewTrackPoint(any(TrackPoint.class));
verify(trackPointCreator, times(1)).onChange(any(Location.class));
}
/**
@@ -78,7 +77,7 @@ public class GPSHandlerTest {
locationHandler.onLocationChanged(createLocation(latitude, 35f, 3, 5, System.currentTimeMillis()));
// then
verify(trackPointCreator, times(0)).onNewTrackPoint(any(TrackPoint.class));
verify(trackPointCreator, times(0)).onChange(any(Location.class));
}
/**
@@ -94,7 +93,7 @@ public class GPSHandlerTest {
// then
// no newTrackPoint called
verify(trackPointCreator, times(0)).onNewTrackPoint(any(TrackPoint.class));
verify(trackPointCreator, times(0)).onChange(any(Location.class));
}
@Test
@@ -107,7 +106,7 @@ public class GPSHandlerTest {
locationHandler.onLocationChanged(createLocation(99.0, 35.0, Long.MAX_VALUE, 15, System.currentTimeMillis()));
// then
verify(trackPointCreator, times(1)).onNewTrackPoint(any(TrackPoint.class));
verify(trackPointCreator, times(1)).onChange(any(Location.class));
}
/**