summaryrefslogtreecommitdiff
path: root/altoslib/AltosLink.java
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2013-09-06 16:50:46 -0700
committerKeith Packard <keithp@keithp.com>2013-09-06 16:50:46 -0700
commit1e52d34137626ca756ea01f317ef7c359e464a5b (patch)
treee7f580827b9dab9ea19b25c5777642c1e7e30acc /altoslib/AltosLink.java
parent29bb16397f14ed617ca3fbf48f2a7b726fd627d8 (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>
Diffstat (limited to 'altoslib/AltosLink.java')
-rw-r--r--altoslib/AltosLink.java14
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) {