From 55a820e517f9705bc80c653b456ce5d8b3a634bc Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Wed, 19 May 2021 10:48:58 -0700 Subject: [PATCH] altosdroid: Synchronize access to the 'rockets' list for online maps Online maps gets rockets added by the telem code and the same data are used to create the maps UI. Synchronise access to that object to prevent simutaneous operations. Signed-off-by: Keith Packard --- .../AltosDroid/AltosMapOnline.java | 50 +++++++++++-------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/altosdroid/app/src/main/java/org/altusmetrum/AltosDroid/AltosMapOnline.java b/altosdroid/app/src/main/java/org/altusmetrum/AltosDroid/AltosMapOnline.java index c35bbb4d..76cd990b 100644 --- a/altosdroid/app/src/main/java/org/altusmetrum/AltosDroid/AltosMapOnline.java +++ b/altosdroid/app/src/main/java/org/altusmetrum/AltosDroid/AltosMapOnline.java @@ -174,10 +174,12 @@ public class AltosMapOnline implements AltosDroidMapInterface, GoogleMap.OnMarke } private RocketOnline[] sorted_rockets() { - RocketOnline[] rocket_array = rockets.values().toArray(new RocketOnline[0]); + synchronized(rockets) { + RocketOnline[] rocket_array = rockets.values().toArray(new RocketOnline[0]); - Arrays.sort(rocket_array); - return rocket_array; + Arrays.sort(rocket_array); + return rocket_array; + } } public void onMapClick(LatLng lat_lng) { @@ -260,22 +262,26 @@ public class AltosMapOnline implements AltosDroidMapInterface, GoogleMap.OnMarke if (mMap == null) return; - if (rockets.containsKey(serial)) { - rocket = rockets.get(serial); - rocket.set_position(new AltosLatLon(state.gps.lat, state.gps.lon), state.received_time); - } else { - rocket = new RocketOnline(context, - serial, - mMap, state.gps.lat, state.gps.lon, - state.received_time); - rockets.put(serial, rocket); + synchronized(rockets) { + if (rockets.containsKey(serial)) { + rocket = rockets.get(serial); + rocket.set_position(new AltosLatLon(state.gps.lat, state.gps.lon), state.received_time); + } else { + rocket = new RocketOnline(context, + serial, + mMap, state.gps.lat, state.gps.lon, + state.received_time); + rockets.put(serial, rocket); + } } } private void remove_rocket(int serial) { - RocketOnline rocket = rockets.get(serial); - rocket.remove(); - rockets.remove(serial); + synchronized(rockets) { + RocketOnline rocket = rockets.get(serial); + rocket.remove(); + rockets.remove(serial); + } } public void set_visible(boolean visible) { @@ -286,13 +292,15 @@ public class AltosMapOnline implements AltosDroidMapInterface, GoogleMap.OnMarke public void show(TelemetryState telem_state, AltosState state, AltosGreatCircle from_receiver, Location receiver) { if (telem_state != null) { - for (int serial : rockets.keySet()) { - if (!telem_state.containsKey(serial)) - remove_rocket(serial); - } + synchronized(rockets) { + for (int serial : rockets.keySet()) { + if (!telem_state.containsKey(serial)) + remove_rocket(serial); + } - for (int serial : telem_state.keySet()) { - set_rocket(serial, telem_state.get(serial)); + for (int serial : telem_state.keySet()) { + set_rocket(serial, telem_state.get(serial)); + } } } -- 2.30.2