From 7c63d5202c3ab453028eefa2a6f81cd2f1f70ca3 Mon Sep 17 00:00:00 2001 From: Boris Grozev Date: Wed, 11 Jan 2017 12:30:30 -0600 Subject: [PATCH] fix: Propagates close() to the underlying DatagramSocket implementation fixing a leak of fd's while the the objects waiting to be finalized. --- .../java/org/ice4j/ice/ComponentSocket.java | 8 +++- .../ice4j/socket/MergingDatagramSocket.java | 42 +++++++++++-------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/ice4j/ice/ComponentSocket.java b/src/main/java/org/ice4j/ice/ComponentSocket.java index f52b6eea..92eb949a 100644 --- a/src/main/java/org/ice4j/ice/ComponentSocket.java +++ b/src/main/java/org/ice4j/ice/ComponentSocket.java @@ -203,8 +203,12 @@ public void close() } finally { - component.getParentStream().removePairStateChangeListener(this); - component = null; + Component component = this.component; + if (component != null) + { + component.getParentStream().removePairStateChangeListener(this); + this.component = null; + } } } } diff --git a/src/main/java/org/ice4j/socket/MergingDatagramSocket.java b/src/main/java/org/ice4j/socket/MergingDatagramSocket.java index af7235f1..789f09de 100644 --- a/src/main/java/org/ice4j/socket/MergingDatagramSocket.java +++ b/src/main/java/org/ice4j/socket/MergingDatagramSocket.java @@ -136,29 +136,37 @@ public boolean isClosed() @Override public void close() { - if (isClosed()) + try { - return; + super.close(); } - closed = true; - logger.info("Closing."); - - // XXX do we want to risk obtaining the lock here, or should we just - // let any thread in receive() find out about the close after it's next - // timeout? - synchronized (receiveLock) + finally { - receiveLock.notifyAll(); - } - synchronized (socketContainersSyncRoot) - { - active = null; - for (SocketContainer container : socketContainers) + if (isClosed()) + { + return; + } + closed = true; + logger.info("Closing."); + + // XXX do we want to risk obtaining the lock here, or should we just + // let any thread in receive() find out about the close after it's + // next timeout? + synchronized (receiveLock) + { + receiveLock.notifyAll(); + } + + synchronized (socketContainersSyncRoot) { - container.close(false); + active = null; + for (SocketContainer container : socketContainers) + { + container.close(false); + } + socketContainers = new SocketContainer[0]; } - socketContainers = new SocketContainer[0]; } }