From 9238347bd42895a1ed8e5222398d6eb3405f9b90 Mon Sep 17 00:00:00 2001 From: Vzor- Date: Mon, 6 Jan 2025 09:09:19 -0500 Subject: [PATCH 01/11] Removed Some Port Exceptions --- src/main/java/jssc/SerialPort.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/jssc/SerialPort.java b/src/main/java/jssc/SerialPort.java index f43a30225..34791c464 100644 --- a/src/main/java/jssc/SerialPort.java +++ b/src/main/java/jssc/SerialPort.java @@ -1155,11 +1155,10 @@ private EventThread getNewEventThread() { * @throws SerialPortException if exception occurred */ public synchronized boolean removeEventListener() throws SerialPortException { - checkPortOpened("removeEventListener()"); + eventThread.terminateThread(); if(!eventListenerAdded){ - throw new SerialPortException(this, "removeEventListener()", SerialPortException.TYPE_CANT_REMOVE_LISTENER); + return false; } - eventThread.terminateThread(); setEventsMask(0); if(Thread.currentThread().getId() != eventThread.getId()){ if(eventThread.isAlive()){ @@ -1184,7 +1183,6 @@ public synchronized boolean removeEventListener() throws SerialPortException { * @throws SerialPortException if exception occurred */ public synchronized boolean closePort() throws SerialPortException { - checkPortOpened("closePort()"); if(eventListenerAdded){ removeEventListener(); } From f7903734535ee92676ed8064ef88cc7c8736a1d0 Mon Sep 17 00:00:00 2001 From: Vzor- Date: Mon, 6 Jan 2025 12:00:05 -0500 Subject: [PATCH 02/11] Remove Redundant Guard --- src/main/java/jssc/SerialPort.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/jssc/SerialPort.java b/src/main/java/jssc/SerialPort.java index 34791c464..7258072d0 100644 --- a/src/main/java/jssc/SerialPort.java +++ b/src/main/java/jssc/SerialPort.java @@ -1160,14 +1160,14 @@ public synchronized boolean removeEventListener() throws SerialPortException { return false; } setEventsMask(0); + //Guard against currentThread().join deadlock if(Thread.currentThread().getId() != eventThread.getId()){ - if(eventThread.isAlive()){ - try { - eventThread.join(5000); - } - catch (InterruptedException ex) { - throw new SerialPortException(this, "removeEventListener()", SerialPortException.TYPE_LISTENER_THREAD_INTERRUPTED); - } + try { + Thread.currentThread().join(6); + eventThread.join(5000); + } + catch (InterruptedException ex) { + throw new SerialPortException(this, "removeEventListener()", SerialPortException.TYPE_LISTENER_THREAD_INTERRUPTED); } } methodErrorOccurred = null; From aa2ee2a8c4bd8bca4df47f685d2ff45fcf988700 Mon Sep 17 00:00:00 2001 From: Vzor- Date: Mon, 6 Jan 2025 12:36:42 -0500 Subject: [PATCH 03/11] Removed Unnecessary boolean --- src/main/java/jssc/SerialPort.java | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/src/main/java/jssc/SerialPort.java b/src/main/java/jssc/SerialPort.java index 7258072d0..fd75eb13f 100644 --- a/src/main/java/jssc/SerialPort.java +++ b/src/main/java/jssc/SerialPort.java @@ -41,7 +41,6 @@ public class SerialPort { private final String portName; private volatile boolean portOpened = false; private boolean maskAssigned = false; - private boolean eventListenerAdded = false; //since 2.2.0 -> private volatile Method methodErrorOccurred = null; @@ -1063,9 +1062,9 @@ public boolean isRLSD() throws SerialPortException { * * @throws SerialPortException if exception occurred */ - public void addEventListener(SerialPortEventListener listener) throws SerialPortException { - addEventListener(listener, MASK_RXCHAR, false); - } +// public void addEventListener(SerialPortEventListener listener) throws SerialPortException { +// addEventListener(listener, MASK_RXCHAR, false); +// } /** * Add event listener. Object of "SerialPortEventListener" type shall be sent @@ -1080,9 +1079,9 @@ public void addEventListener(SerialPortEventListener listener) throws SerialPort * * @throws SerialPortException if exception occurred */ - public void addEventListener(SerialPortEventListener listener, int mask) throws SerialPortException { - addEventListener(listener, mask, true); - } +// public void addEventListener(SerialPortEventListener listener, int mask) throws SerialPortException { +// addEventListener(listener, mask, true); +// } /** * Internal method. Add event listener. Object of "SerialPortEventListener" type shall be sent @@ -1102,9 +1101,9 @@ public void addEventListener(SerialPortEventListener listener, int mask) throws * * @throws SerialPortException if exception occurred */ - private synchronized void addEventListener(SerialPortEventListener listener, int mask, boolean overwriteMask) throws SerialPortException { + public synchronized void addEventListener(SerialPortEventListener listener, int mask, boolean overwriteMask) throws SerialPortException { checkPortOpened("addEventListener()"); - if(!eventListenerAdded){ + if(eventThread == null || !eventThread.isAlive()){ if((maskAssigned && overwriteMask) || !maskAssigned) { setEventsMask(mask); } @@ -1125,7 +1124,6 @@ private synchronized void addEventListener(SerialPortEventListener listener, int } //<- since 2.2.0 eventThread.start(); - eventListenerAdded = true; } else { throw new SerialPortException(this, "addEventListener()", SerialPortException.TYPE_LISTENER_ALREADY_ADDED); @@ -1155,10 +1153,10 @@ private EventThread getNewEventThread() { * @throws SerialPortException if exception occurred */ public synchronized boolean removeEventListener() throws SerialPortException { - eventThread.terminateThread(); - if(!eventListenerAdded){ + if(eventThread == null || !eventThread.isAlive()){ return false; } + eventThread.terminateThread(); setEventsMask(0); //Guard against currentThread().join deadlock if(Thread.currentThread().getId() != eventThread.getId()){ @@ -1171,7 +1169,6 @@ public synchronized boolean removeEventListener() throws SerialPortException { } } methodErrorOccurred = null; - eventListenerAdded = false; return true; } @@ -1183,9 +1180,7 @@ public synchronized boolean removeEventListener() throws SerialPortException { * @throws SerialPortException if exception occurred */ public synchronized boolean closePort() throws SerialPortException { - if(eventListenerAdded){ - removeEventListener(); - } + removeEventListener(); boolean returnValue = serialInterface.closePort(portHandle); if(returnValue){ maskAssigned = false; From e7981b88d28afce94c7982ec87fff41c844b3ddc Mon Sep 17 00:00:00 2001 From: Vzor- Date: Mon, 6 Jan 2025 12:37:56 -0500 Subject: [PATCH 04/11] Typo --- src/main/java/jssc/SerialPort.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/jssc/SerialPort.java b/src/main/java/jssc/SerialPort.java index fd75eb13f..07335302b 100644 --- a/src/main/java/jssc/SerialPort.java +++ b/src/main/java/jssc/SerialPort.java @@ -1062,9 +1062,9 @@ public boolean isRLSD() throws SerialPortException { * * @throws SerialPortException if exception occurred */ -// public void addEventListener(SerialPortEventListener listener) throws SerialPortException { -// addEventListener(listener, MASK_RXCHAR, false); -// } + public void addEventListener(SerialPortEventListener listener) throws SerialPortException { + addEventListener(listener, MASK_RXCHAR, false); + } /** * Add event listener. Object of "SerialPortEventListener" type shall be sent @@ -1079,9 +1079,9 @@ public boolean isRLSD() throws SerialPortException { * * @throws SerialPortException if exception occurred */ -// public void addEventListener(SerialPortEventListener listener, int mask) throws SerialPortException { -// addEventListener(listener, mask, true); -// } + public void addEventListener(SerialPortEventListener listener, int mask) throws SerialPortException { + addEventListener(listener, mask, true); + } /** * Internal method. Add event listener. Object of "SerialPortEventListener" type shall be sent From bbe271bbb572ffbce209d2ced29c67e89aeaf4a4 Mon Sep 17 00:00:00 2001 From: Vzor- Date: Mon, 6 Jan 2025 12:39:04 -0500 Subject: [PATCH 05/11] Typo2 --- src/main/java/jssc/SerialPort.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/jssc/SerialPort.java b/src/main/java/jssc/SerialPort.java index 07335302b..d11b7a182 100644 --- a/src/main/java/jssc/SerialPort.java +++ b/src/main/java/jssc/SerialPort.java @@ -1152,7 +1152,7 @@ private EventThread getNewEventThread() { * * @throws SerialPortException if exception occurred */ - public synchronized boolean removeEventListener() throws SerialPortException { + private synchronized boolean removeEventListener() throws SerialPortException { if(eventThread == null || !eventThread.isAlive()){ return false; } From f62388b101ea29268b9cd6f29b77f9df44094ee9 Mon Sep 17 00:00:00 2001 From: Vzor- Date: Mon, 6 Jan 2025 13:25:21 -0500 Subject: [PATCH 06/11] Added exception handling --- src/main/java/jssc/SerialPort.java | 21 ++++++++++++++------- src/main/java/jssc/SerialPortException.java | 2 +- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/main/java/jssc/SerialPort.java b/src/main/java/jssc/SerialPort.java index d11b7a182..c9e686b22 100644 --- a/src/main/java/jssc/SerialPort.java +++ b/src/main/java/jssc/SerialPort.java @@ -1161,8 +1161,10 @@ private synchronized boolean removeEventListener() throws SerialPortException { //Guard against currentThread().join deadlock if(Thread.currentThread().getId() != eventThread.getId()){ try { - Thread.currentThread().join(6); eventThread.join(5000); + if (eventThread.isAlive()) { + throw new SerialPortException(this, "removeEventListener()", SerialPortException.TYPE_CANT_REMOVE_LISTENER); + } } catch (InterruptedException ex) { throw new SerialPortException(this, "removeEventListener()", SerialPortException.TYPE_LISTENER_THREAD_INTERRUPTED); @@ -1180,13 +1182,18 @@ private synchronized boolean removeEventListener() throws SerialPortException { * @throws SerialPortException if exception occurred */ public synchronized boolean closePort() throws SerialPortException { - removeEventListener(); - boolean returnValue = serialInterface.closePort(portHandle); - if(returnValue){ - maskAssigned = false; - portOpened = false; + //removeEventListener calls setEventsMask, and must occur before calling closePort + try { + removeEventListener(); + } + finally { + boolean returnValue = serialInterface.closePort(portHandle); + if (returnValue) { + maskAssigned = false; + portOpened = false; + } + return returnValue; } - return returnValue; } private EventThread eventThread; diff --git a/src/main/java/jssc/SerialPortException.java b/src/main/java/jssc/SerialPortException.java index b075aef40..d1d1afcc5 100644 --- a/src/main/java/jssc/SerialPortException.java +++ b/src/main/java/jssc/SerialPortException.java @@ -41,7 +41,7 @@ public class SerialPortException extends Exception { /** Event listener thread interrupted **/ final public static String TYPE_LISTENER_THREAD_INTERRUPTED = "Event listener thread interrupted"; /** Can't remove event listener **/ - final public static String TYPE_CANT_REMOVE_LISTENER = "Can't remove event listener, because listener not added"; + final public static String TYPE_CANT_REMOVE_LISTENER = "Can't remove event listener"; /** * @since 0.8 */ From 8dac1232436af0d02b3c2a98ca7384a2e91321f8 Mon Sep 17 00:00:00 2001 From: Vzor- Date: Mon, 6 Jan 2025 13:39:43 -0500 Subject: [PATCH 07/11] logic fix --- src/main/java/jssc/SerialPort.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/jssc/SerialPort.java b/src/main/java/jssc/SerialPort.java index c9e686b22..697f39f96 100644 --- a/src/main/java/jssc/SerialPort.java +++ b/src/main/java/jssc/SerialPort.java @@ -1182,18 +1182,19 @@ private synchronized boolean removeEventListener() throws SerialPortException { * @throws SerialPortException if exception occurred */ public synchronized boolean closePort() throws SerialPortException { + boolean returnValue; //removeEventListener calls setEventsMask, and must occur before calling closePort try { removeEventListener(); } finally { - boolean returnValue = serialInterface.closePort(portHandle); + returnValue = serialInterface.closePort(portHandle); if (returnValue) { maskAssigned = false; portOpened = false; } - return returnValue; } + return returnValue; } private EventThread eventThread; From d6418b8a903f37c381bb325335a6cf641f6e3d5f Mon Sep 17 00:00:00 2001 From: Vzor- Date: Mon, 6 Jan 2025 13:43:22 -0500 Subject: [PATCH 08/11] typo --- src/main/java/jssc/SerialPort.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/jssc/SerialPort.java b/src/main/java/jssc/SerialPort.java index 697f39f96..9619724d0 100644 --- a/src/main/java/jssc/SerialPort.java +++ b/src/main/java/jssc/SerialPort.java @@ -1101,7 +1101,7 @@ public void addEventListener(SerialPortEventListener listener, int mask) throws * * @throws SerialPortException if exception occurred */ - public synchronized void addEventListener(SerialPortEventListener listener, int mask, boolean overwriteMask) throws SerialPortException { + private synchronized void addEventListener(SerialPortEventListener listener, int mask, boolean overwriteMask) throws SerialPortException { checkPortOpened("addEventListener()"); if(eventThread == null || !eventThread.isAlive()){ if((maskAssigned && overwriteMask) || !maskAssigned) { From 33a02458cbdb9d72b6247536ebfc86b41a5fd3e7 Mon Sep 17 00:00:00 2001 From: Vzor- Date: Mon, 6 Jan 2025 14:14:55 -0500 Subject: [PATCH 09/11] typo2 --- src/main/java/jssc/SerialPort.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/jssc/SerialPort.java b/src/main/java/jssc/SerialPort.java index 9619724d0..62cae9e32 100644 --- a/src/main/java/jssc/SerialPort.java +++ b/src/main/java/jssc/SerialPort.java @@ -1152,7 +1152,7 @@ private EventThread getNewEventThread() { * * @throws SerialPortException if exception occurred */ - private synchronized boolean removeEventListener() throws SerialPortException { + public synchronized boolean removeEventListener() throws SerialPortException { if(eventThread == null || !eventThread.isAlive()){ return false; } From cbb5a9fa4c8e93786d71465629df51bd2abbb3bb Mon Sep 17 00:00:00 2001 From: Vzor- Date: Mon, 27 Jan 2025 18:58:20 -0500 Subject: [PATCH 10/11] Added closeport guard --- src/main/java/jssc/SerialPort.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/jssc/SerialPort.java b/src/main/java/jssc/SerialPort.java index 62cae9e32..2c8bb1d24 100644 --- a/src/main/java/jssc/SerialPort.java +++ b/src/main/java/jssc/SerialPort.java @@ -1182,6 +1182,7 @@ public synchronized boolean removeEventListener() throws SerialPortException { * @throws SerialPortException if exception occurred */ public synchronized boolean closePort() throws SerialPortException { + if (!portOpened) return false; boolean returnValue; //removeEventListener calls setEventsMask, and must occur before calling closePort try { From 17aad56e1ff36ca879230fb2a33c03c43e720bda Mon Sep 17 00:00:00 2001 From: Vzor- Date: Wed, 29 Jan 2025 13:40:02 -0500 Subject: [PATCH 11/11] more guarding --- src/main/java/jssc/SerialPort.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main/java/jssc/SerialPort.java b/src/main/java/jssc/SerialPort.java index 2c8bb1d24..0d13532b0 100644 --- a/src/main/java/jssc/SerialPort.java +++ b/src/main/java/jssc/SerialPort.java @@ -1157,7 +1157,9 @@ public synchronized boolean removeEventListener() throws SerialPortException { return false; } eventThread.terminateThread(); - setEventsMask(0); + if (portOpened) { + setEventsMask(0); + } //Guard against currentThread().join deadlock if(Thread.currentThread().getId() != eventThread.getId()){ try { @@ -1182,17 +1184,20 @@ public synchronized boolean removeEventListener() throws SerialPortException { * @throws SerialPortException if exception occurred */ public synchronized boolean closePort() throws SerialPortException { - if (!portOpened) return false; boolean returnValue; //removeEventListener calls setEventsMask, and must occur before calling closePort try { removeEventListener(); } finally { - returnValue = serialInterface.closePort(portHandle); - if (returnValue) { - maskAssigned = false; - portOpened = false; + if (portOpened) { + returnValue = serialInterface.closePort(portHandle); + if (returnValue) { + maskAssigned = false; + portOpened = false; + } + } else { + returnValue = false; } } return returnValue;