From 66c155e41cf51e49e74c5964a2763db4b240792d Mon Sep 17 00:00:00 2001
From: akwizgran <michael@briarproject.org>
Date: Fri, 23 Nov 2012 22:41:12 +0000
Subject: [PATCH] Moved blocking operations off the serial port's event thread.

---
 src/net/sf/briar/plugins/modem/ModemImpl.java | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/src/net/sf/briar/plugins/modem/ModemImpl.java b/src/net/sf/briar/plugins/modem/ModemImpl.java
index 8d47e42fb7..6440269455 100644
--- a/src/net/sf/briar/plugins/modem/ModemImpl.java
+++ b/src/net/sf/briar/plugins/modem/ModemImpl.java
@@ -9,6 +9,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.Executor;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.logging.Logger;
@@ -29,6 +30,7 @@ class ModemImpl implements Modem, SerialPortEventListener {
 	private static final int OK_TIMEOUT = 5 * 1000; // Milliseconds
 	private static final int CONNECT_TIMEOUT = 60 * 1000; // Milliseconds
 
+	private final Executor executor;
 	private final Callback callback;
 	private final SerialPort port;
 	private final AtomicBoolean initialised, offHook, connected;
@@ -38,7 +40,8 @@ class ModemImpl implements Modem, SerialPortEventListener {
 	private int lineLen = 0;
 
 
-	ModemImpl(Callback callback, String portName) {
+	ModemImpl(Executor executor, Callback callback, String portName) {
+		this.executor = executor;
 		this.callback = callback;
 		port = new SerialPort(portName);
 		initialised = new AtomicBoolean(false);
@@ -187,8 +190,16 @@ class ModemImpl implements Modem, SerialPortEventListener {
 							initialised.notifyAll();
 					}
 				} else if(s.equals("RING")) {
-					// FIXME: Don't do this on the event thread
-					answer();
+					executor.execute(new Runnable() {
+						public void run() {
+							try {
+								answer();
+							} catch(IOException e) {
+								if(LOG.isLoggable(WARNING))
+									LOG.warning(e.toString());
+							}
+						}
+					});
 				}
 			} else {
 				lineLen++;
-- 
GitLab