diff options
author | Keith Packard <keithp@keithp.com> | 2013-09-06 16:50:46 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2013-09-06 16:50:46 -0700 |
commit | 1e52d34137626ca756ea01f317ef7c359e464a5b (patch) | |
tree | e7f580827b9dab9ea19b25c5777642c1e7e30acc | |
parent | 29bb16397f14ed617ca3fbf48f2a7b726fd627d8 (diff) |
altoslib: Lock access to AltosLink config_data
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>
-rw-r--r-- | altoslib/AltosLink.java | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/altoslib/AltosLink.java b/altoslib/AltosLink.java index b1bf525b..4823a986 100644 --- a/altoslib/AltosLink.java +++ b/altoslib/AltosLink.java @@ -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) { |