changeset 536:797047eb544a

Fix RequestQueue shutdown Processing loop has a blocking wait, can leave hanging on shutdown. This interrupts the processing thread during stop to prevent such issues. reviewed-by: neugens review-thread: http://icedtea.classpath.org/pipermail/thermostat/2012-August/002677.html
author Jon VanAlten <jon.vanalten@redhat.com>
date Thu, 16 Aug 2012 14:35:57 -0400
parents 6def633267ae
children 0e677821d3d4
files client/command/src/main/java/com/redhat/thermostat/client/command/internal/RequestQueueImpl.java
diffstat 1 files changed, 15 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/client/command/src/main/java/com/redhat/thermostat/client/command/internal/RequestQueueImpl.java	Thu Aug 16 14:35:55 2012 -0400
+++ b/client/command/src/main/java/com/redhat/thermostat/client/command/internal/RequestQueueImpl.java	Thu Aug 16 14:35:57 2012 -0400
@@ -50,7 +50,8 @@
 
     private final BlockingQueue<Request> queue;
     private final ConfigurationRequestContext ctx;
-    private boolean processing;
+    private volatile boolean processing;
+    private Thread runningThread;
 
     RequestQueueImpl(ConfigurationRequestContext ctx) {
         processing = false;
@@ -63,21 +64,30 @@
         queue.add(request);
     }
 
-    void startProcessingRequests() {
-        if (!processing) {
+    synchronized void startProcessingRequests() {
+        if (!running()) {
             processing = true;
             new QueueRunner().start();
         }
     }
 
-    void stopProcessingRequests() {
-        processing = false;
+    synchronized void stopProcessingRequests() {
+        if (running()) {
+            processing = false;
+            runningThread.interrupt();
+            runningThread = null;
+        }
+    }
+
+    private boolean running() {
+        return runningThread != null && runningThread.isAlive();
     }
 
     private class QueueRunner extends Thread {
 
         @Override
         public void run() {
+            runningThread = Thread.currentThread();
             while (processing) {
                 Request request = null;
                 try {