From 1caa5c05855bc01d86546cbb18151e66960bd086 Mon Sep 17 00:00:00 2001 From: Lyubomir Marinov <lyubomir.marinov@jitsi.org> Date: Sat, 12 Apr 2014 23:34:41 +0300 Subject: [PATCH] Fixes memory leaks. --- .../transform/dtls/DtlsPacketTransformer.java | 9 ++++++--- .../transform/dtls/DtlsTransformEngine.java | 12 +++++++++++- .../transform/zrtp/ZRTPTransformEngine.java | 15 ++++++++++++++- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/org/jitsi/impl/neomedia/transform/dtls/DtlsPacketTransformer.java b/src/org/jitsi/impl/neomedia/transform/dtls/DtlsPacketTransformer.java index 8d1f0656..c4fecd44 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 30fada3d..fa146a37 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 4991b925..292975f7 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) -- GitLab