diff --git a/src/org/jitsi/impl/neomedia/transform/dtls/DtlsPacketTransformer.java b/src/org/jitsi/impl/neomedia/transform/dtls/DtlsPacketTransformer.java index 8d1f065684150c8fe14e4ba43b043a4fe2cbedd2..c4fecd447659ebe03fe43e68e9ef7492d55781df 100644 --- a/src/org/jitsi/impl/neomedia/transform/dtls/DtlsPacketTransformer.java +++ b/src/org/jitsi/impl/neomedia/transform/dtls/DtlsPacketTransformer.java @@ -227,10 +227,13 @@ private void closeDatagramTransport() * to try to establish a DTLS connection. * * @param i the number of tries remaining after the current one + * @param datagramTransport * @return <tt>true</tt> to try to establish a DTLS connection; otherwise, * <tt>false</tt> */ - private boolean enterRunInConnectThreadLoop(int i) + private boolean enterRunInConnectThreadLoop( + int i, + DatagramTransport datagramTransport) { if ((i < 0) || (i > CONNECT_TRIES)) { @@ -654,7 +657,7 @@ private void runInConnectThread( for (int i = CONNECT_TRIES - 1; i >= 0; i--) { - if (!enterRunInConnectThreadLoop(i)) + if (!enterRunInConnectThreadLoop(i, datagramTransport)) break; try { @@ -694,7 +697,7 @@ else if (dtlsProtocol instanceof DTLSServerProtocol) for (int i = CONNECT_TRIES - 1; i >= 0; i--) { - if (!enterRunInConnectThreadLoop(i)) + if (!enterRunInConnectThreadLoop(i, datagramTransport)) break; try { diff --git a/src/org/jitsi/impl/neomedia/transform/dtls/DtlsTransformEngine.java b/src/org/jitsi/impl/neomedia/transform/dtls/DtlsTransformEngine.java index 30fada3d789da8eeb12d4930ea3ac0d1656948c4..fa146a377436ab13eec4076379cf48e840c05c19 100644 --- a/src/org/jitsi/impl/neomedia/transform/dtls/DtlsTransformEngine.java +++ b/src/org/jitsi/impl/neomedia/transform/dtls/DtlsTransformEngine.java @@ -25,6 +25,13 @@ public class DtlsTransformEngine */ private AbstractRTPConnector connector; + /** + * The indicator which determines whether + * {@link SrtpControl.TransformEngine#cleanup()} has been invoked on this + * instance to prepare it for garbage collection. + */ + private boolean disposed = false; + /** * The <tt>DtlsControl</tt> which has initialized this instance. */ @@ -62,8 +69,11 @@ public DtlsTransformEngine(DtlsControlImpl dtlsControl) /** * {@inheritDoc} */ + @Override public void cleanup() { + disposed = true; + for (int i = 0; i < packetTransformers.length; i++) { DtlsPacketTransformer packetTransformer = packetTransformers[i]; @@ -123,7 +133,7 @@ private DtlsPacketTransformer getPacketTransformer(int componentID) int index = componentID - 1; DtlsPacketTransformer packetTransformer = packetTransformers[index]; - if (packetTransformer == null) + if ((packetTransformer == null) && !disposed) { packetTransformer = createPacketTransformer(componentID); if (packetTransformer != null) diff --git a/src/org/jitsi/impl/neomedia/transform/zrtp/ZRTPTransformEngine.java b/src/org/jitsi/impl/neomedia/transform/zrtp/ZRTPTransformEngine.java index 4991b9252dfe9f8cec2b45851b07e0ea59c28a62..292975f70e2fdb58dabdd0937b6ec1fca218859a 100644 --- a/src/org/jitsi/impl/neomedia/transform/zrtp/ZRTPTransformEngine.java +++ b/src/org/jitsi/impl/neomedia/transform/zrtp/ZRTPTransformEngine.java @@ -396,6 +396,16 @@ public void run() */ private long zrtpUnprotect; + /** + * The indicator which determines whether + * {@link SrtpControl.TransformEngine#cleanup()} has been invoked on this + * instance to prepare it for garbage collection. Disallows + * {@link #getRTCPTransformer()} to initialize a new + * <tt>ZRTCPTransformer</tt> instance which cannot possibly be correctly + * used after the disposal of this instance anyway. + */ + private boolean disposed = false; + /** * Construct a ZRTPTransformEngine. * @@ -418,7 +428,7 @@ public ZRTPTransformEngine() */ public ZRTCPTransformer getRTCPTransformer() { - if(zrtcpTransformer == null) + if ((zrtcpTransformer == null) && !disposed) zrtcpTransformer = new ZRTCPTransformer(); return zrtcpTransformer; } @@ -670,8 +680,11 @@ public void stopZrtp() /** * Cleanup function for any remaining timers */ + @Override public void cleanup() { + disposed = true; + stopZrtp(); if (timeoutProvider != null)