From 877cb13cf3a41d301c164131813b78802a97c750 Mon Sep 17 00:00:00 2001 From: Benoit Foucher Date: Fri, 13 Sep 2019 12:50:50 +0200 Subject: [PATCH] Fixed race condition in Android/UDP transport, fixes #527 --- .../java/IceInternal/UdpMulticastClientTransceiver.java | 3 ++- .../java/IceInternal/UdpMulticastServerTransceiver.java | 8 +++++++- .../zeroc/IceInternal/UdpMulticastClientTransceiver.java | 3 ++- .../zeroc/IceInternal/UdpMulticastServerTransceiver.java | 8 +++++++- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/java-compat/src/Ice/src/main/java/IceInternal/UdpMulticastClientTransceiver.java b/java-compat/src/Ice/src/main/java/IceInternal/UdpMulticastClientTransceiver.java index 59e521cc5a4..25a26806bc6 100644 --- a/java-compat/src/Ice/src/main/java/IceInternal/UdpMulticastClientTransceiver.java +++ b/java-compat/src/Ice/src/main/java/IceInternal/UdpMulticastClientTransceiver.java @@ -27,7 +27,9 @@ public java.nio.channels.SelectableChannel fd() @Override public void setReadyCallback(ReadyCallback callback) { + assert(_readyCallback == null && callback != null); _readyCallback = callback; + _thread.start(); } @Override @@ -249,7 +251,6 @@ public void run() runWriteThread(); } }; - _thread.start(); } catch(Exception ex) { diff --git a/java-compat/src/Ice/src/main/java/IceInternal/UdpMulticastServerTransceiver.java b/java-compat/src/Ice/src/main/java/IceInternal/UdpMulticastServerTransceiver.java index 15abb5ad2d0..6cdecaa8f8c 100644 --- a/java-compat/src/Ice/src/main/java/IceInternal/UdpMulticastServerTransceiver.java +++ b/java-compat/src/Ice/src/main/java/IceInternal/UdpMulticastServerTransceiver.java @@ -27,7 +27,14 @@ public java.nio.channels.SelectableChannel fd() @Override public void setReadyCallback(ReadyCallback callback) { + assert(_readyCallback == null && callback != null); _readyCallback = callback; + + // + // Start the thread only once the ready callback is set or otherwise the thread + // might start receiving datagrams but wouldn't be able to notify the thread pool. + // + _thread.start(); } @Override @@ -255,7 +262,6 @@ public void run() runReadThread(); } }; - _thread.start(); } catch(Exception ex) { diff --git a/java/src/Ice/src/main/java/com/zeroc/IceInternal/UdpMulticastClientTransceiver.java b/java/src/Ice/src/main/java/com/zeroc/IceInternal/UdpMulticastClientTransceiver.java index 67b0f1f046f..25759084ff3 100644 --- a/java/src/Ice/src/main/java/com/zeroc/IceInternal/UdpMulticastClientTransceiver.java +++ b/java/src/Ice/src/main/java/com/zeroc/IceInternal/UdpMulticastClientTransceiver.java @@ -27,7 +27,9 @@ public java.nio.channels.SelectableChannel fd() @Override public void setReadyCallback(ReadyCallback callback) { + assert(_readyCallback == null && callback != null); _readyCallback = callback; + _thread.start(); } @Override @@ -249,7 +251,6 @@ public void run() runWriteThread(); } }; - _thread.start(); } catch(Exception ex) { diff --git a/java/src/Ice/src/main/java/com/zeroc/IceInternal/UdpMulticastServerTransceiver.java b/java/src/Ice/src/main/java/com/zeroc/IceInternal/UdpMulticastServerTransceiver.java index 88668e61c3a..345c3bc0ca2 100644 --- a/java/src/Ice/src/main/java/com/zeroc/IceInternal/UdpMulticastServerTransceiver.java +++ b/java/src/Ice/src/main/java/com/zeroc/IceInternal/UdpMulticastServerTransceiver.java @@ -27,7 +27,14 @@ public java.nio.channels.SelectableChannel fd() @Override public void setReadyCallback(ReadyCallback callback) { + assert(_readyCallback == null && callback != null); _readyCallback = callback; + + // + // Start the thread only once the ready callback is set or otherwise the thread + // might start receiving datagrams but wouldn't be able to notify the thread pool. + // + _thread.start(); } @Override @@ -255,7 +262,6 @@ public void run() runReadThread(); } }; - _thread.start(); } catch(Exception ex) {