]> git.basschouten.com Git - openhab-addons.git/commitdiff
[upb] Fix race condition (#11366)
authorMarcus Better <marcusb@users.noreply.github.com>
Mon, 11 Oct 2021 19:44:44 +0000 (15:44 -0400)
committerGitHub <noreply@github.com>
Mon, 11 Oct 2021 19:44:44 +0000 (21:44 +0200)
There was a harmless race condition between a message being written
and the PIM being initalized to message mode by the binding. This adds
a latch to ensure writes happen after initalization.

Signed-off-by: Marcus Better <marcus@better.se>
bundles/org.openhab.binding.upb/src/main/java/org/openhab/binding/upb/internal/handler/SerialIoThread.java

index 813f95aa5fbd44f32eac443a4dd0b18b2820aff7..24248fdd5052ad68ddb7b5a7eacaeb90c9dcaff4 100644 (file)
@@ -60,7 +60,19 @@ public class SerialIoThread extends Thread {
     private final MessageListener listener;
     // Single-threaded executor for writes that serves to serialize writes.
     private final ExecutorService writeExecutor = new ThreadPoolExecutor(1, 1, 30, TimeUnit.SECONDS,
-            new LinkedBlockingQueue<>(WRITE_QUEUE_LENGTH), new NamedThreadFactory("upb-serial-writer", true));
+            new LinkedBlockingQueue<>(WRITE_QUEUE_LENGTH), new NamedThreadFactory("upb-serial-writer", true)) {
+        @Override
+        protected void beforeExecute(final @Nullable Thread t, final @Nullable Runnable r) {
+            // ensure we have prepared the PIM before allowing any writes
+            super.beforeExecute(t, r);
+            try {
+                initialized.await();
+            } catch (final InterruptedException e) {
+                t.interrupt();
+            }
+        }
+    };
+    private final CountDownLatch initialized = new CountDownLatch(1);
     private final SerialPort serialPort;
 
     private volatile @Nullable WriteRunnable currentWrite;
@@ -202,6 +214,9 @@ public class SerialIoThread extends Thread {
             out.flush();
         } catch (final IOException e) {
             logger.warn("error setting message mode", e);
+        } finally {
+            // signal that writes can proceed
+            initialized.countDown();
         }
     }