altosui: Ensure serial code tracks reply nesting correctly
authorKeith Packard <keithp@keithp.com>
Wed, 10 Aug 2011 01:27:19 +0000 (18:27 -0700)
committerKeith Packard <keithp@keithp.com>
Wed, 10 Aug 2011 01:27:19 +0000 (18:27 -0700)
Trap any exceptional return conditions from 'get_reply' to make sure
in_reply gets decremented.

Signed-off-by: Keith Packard <keithp@keithp.com>
altosui/AltosSerial.java

index 5e496d7f3d8070181018d48edc09c50255fc0a38..b089c9c40c580beb7764135fb0c3ead7be9a374a 100644 (file)
@@ -213,31 +213,38 @@ public class AltosSerial implements Runnable {
 
        public String get_reply(int timeout) throws InterruptedException {
                boolean can_cancel = true;
-               ++in_reply;
+               String  reply = null;
 
-               if (SwingUtilities.isEventDispatchThread()) {
-                       can_cancel = false;
-                       if (remote)
-                               System.out.printf("Uh-oh, reading remote serial device from swing thread\n");
-               }
-               flush_output();
-               if (remote && can_cancel) {
-                       timeout = 500;
-               }
-               abort = false;
-               timeout_started = false;
-               for (;;) {
-                       AltosLine line = reply_queue.poll(timeout, TimeUnit.MILLISECONDS);
-                       if (line != null) {
-                               stop_timeout_dialog();
-                               --in_reply;
-                               return line.line;
+               try {
+                       ++in_reply;
+
+                       if (SwingUtilities.isEventDispatchThread()) {
+                               can_cancel = false;
+                               if (remote)
+                                       System.out.printf("Uh-oh, reading remote serial device from swing thread\n");
                        }
-                       if (!remote || !can_cancel || check_timeout()) {
-                               --in_reply;
-                               return null;
+                       flush_output();
+                       if (remote && can_cancel) {
+                               timeout = 500;
                        }
+                       abort = false;
+                       timeout_started = false;
+                       for (;;) {
+                               AltosLine line = reply_queue.poll(timeout, TimeUnit.MILLISECONDS);
+                               if (line != null) {
+                                       stop_timeout_dialog();
+                                       reply = line.line;
+                                       break;
+                               }
+                               if (!remote || !can_cancel || check_timeout()) {
+                                       reply = null;
+                                       break;
+                               }
+                       }
+               } finally {
+                       --in_reply;
                }
+               return reply;
        }
 
        public String get_reply() throws InterruptedException {