altoslib: Lock access to AltosLink config_data
authorKeith Packard <keithp@keithp.com>
Fri, 6 Sep 2013 23:50:46 +0000 (16:50 -0700)
committerKeith Packard <keithp@keithp.com>
Fri, 6 Sep 2013 23:50:46 +0000 (16:50 -0700)
Prevents multiple callers from trying to get config data at the same
time and messing up the serial line

Signed-off-by: Keith Packard <keithp@keithp.com>
altoslib/AltosLink.java

index b1bf525b1af48b6aae09f4ca8793ddbe8a1e8643..4823a986011c1ec80f443bfc16c6cc0e24458ce3 100644 (file)
@@ -40,12 +40,12 @@ public abstract class AltosLink implements Runnable {
        public LinkedList<LinkedBlockingQueue<AltosLine>> monitors = new LinkedList<LinkedBlockingQueue<AltosLine>> ();;
        public LinkedBlockingQueue<AltosLine> reply_queue = new LinkedBlockingQueue<AltosLine>();
 
-       public void add_monitor(LinkedBlockingQueue<AltosLine> q) {
+       public synchronized void add_monitor(LinkedBlockingQueue<AltosLine> q) {
                set_monitor(true);
                monitors.add(q);
        }
 
-       public void remove_monitor(LinkedBlockingQueue<AltosLine> q) {
+       public synchronized void remove_monitor(LinkedBlockingQueue<AltosLine> q) {
                monitors.remove(q);
                if (monitors.isEmpty())
                        set_monitor(false);
@@ -256,6 +256,8 @@ public abstract class AltosLink implements Runnable {
        public String callsign;
        AltosConfigData config_data;
 
+       private Object config_data_lock = new Object();
+
        private int telemetry_len() {
                return AltosLib.telemetry_len(telemetry);
        }
@@ -329,9 +331,11 @@ public abstract class AltosLink implements Runnable {
        }
 
        public AltosConfigData config_data() throws InterruptedException, TimeoutException {
-               if (config_data == null)
-                       config_data = new AltosConfigData(this);
-               return config_data;
+               synchronized(config_data_lock) {
+                       if (config_data == null)
+                               config_data = new AltosConfigData(this);
+                       return config_data;
+               }
        }
 
        public void set_callsign(String callsign) {