Skip to content

JabberClient does not dispose properly #99

@GoogleCodeExporter

Description

@GoogleCodeExporter
Calling JabberClient.Close or dereferencing instances do not allow the
object to cleanup after itself. Sockets may be left open, memory is
consumed, streams can be left open.  Below are 5 areas I made changes to
allow the objects to properly dispose. This only serves as a starting point
to address this issue.  My use case was pretty simple Socket based
connections with no compression, encryption, etc.

1.
AsyncSocket.Close
 if (m_stream != null)
                    m_stream.Close();
                else
needs a m_sock.Close() above the m_stream.Close().  Closing the
networkstream will not close the underlying socket because when it is
instantiated ownsSocket is not set to true

2.
~AsyncSocket()
        {
                m_pending.Close();
            m_pending = null;
        }

Cleanup memory stream in destructor. 



3. Add interface IDisposable to SocketStanza Stream
         public  void Dispose()
        {
            m_timer.Dispose();
            m_timer = null;


            m_elements.OnDocumentStart -= new
ProtocolHandler(m_elements_OnDocumentStart);
            m_elements.OnDocumentEnd -= new
bedrock.ObjectHandler(m_elements_OnDocumentEnd);
            m_elements.OnElement -= new ProtocolHandler(m_elements_OnElement);
            m_elements.OnError -= new
bedrock.ExceptionHandler(m_elements_OnError);
            m_elements = null;

        }

4. Catch all m_timer calls when m_timer may now be null


5. In XmppStream.Errored and .Closed change
if ((m_stanzas != null) && (!m_stanzas.Acceptable))
                    m_stanzas = null;

to

                if ((m_stanzas != null) && (!m_stanzas.Acceptable))  //JAK
Added shutdown logic
                {
                    try
                    {
                            if (m_stanzas != null)
                            {
                                if (m_stanzas.Connected)
                                {
                                    m_stanzas.Close(false);
                                }
                                if (m_stanzas is IDisposable)
                                {
                                    IDisposable disposable =
(IDisposable)m_stanzas;
                                    disposable.Dispose();
                                }
                            }
                    }
                    catch { }
                    m_stanzas = null;
                }



Original issue reported on code.google.com by jk...@tricomsystems.net on 30 Mar 2010 at 1:43

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions