Fix leak on sending message caused by circular ownership between nsMsgCompose and nsMsgComposeSendListener. b=66887 r=ducarroz@netscape.com sr=sspitzer@netscape.com

This commit is contained in:
dbaron%fas.harvard.edu 2001-03-04 19:51:05 +00:00
Родитель d8d2e77f91
Коммит fc2e7e21f9
2 изменённых файлов: 8 добавлений и 10 удалений

Просмотреть файл

@ -111,7 +111,6 @@ nsMsgCompose::nsMsgCompose()
mWhatHolder = 1;
mDocumentListener = nsnull;
mMsgSend = nsnull;
m_sendListener = nsnull;
m_window = nsnull;
m_editor = nsnull;
mQuoteStreamListener=nsnull;
@ -145,7 +144,6 @@ nsMsgCompose::~nsMsgCompose()
mDocumentListener->SetComposeObj(nsnull);
NS_RELEASE(mDocumentListener);
}
NS_IF_RELEASE(m_sendListener);
NS_IF_RELEASE(m_compFields);
NS_IF_RELEASE(mQuoteStreamListener);
}
@ -568,16 +566,17 @@ nsresult nsMsgCompose::_SendMsg(MSG_DeliverMode deliverMode, nsIMsgIdentity *ide
bodyLength = PL_strlen(bodyString);
// Create the listener for the send operation...
m_sendListener = new nsMsgComposeSendListener();
if (!m_sendListener)
return NS_ERROR_FAILURE;
nsMsgComposeSendListener *sendListener = new nsMsgComposeSendListener();
if (!sendListener)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(m_sendListener);
// We must hold a reference to it as long as we have tArray (below)
nsCOMPtr<nsIMsgSendListener> kungFuDeathGrip(sendListener);
// set this object for use on completion...
m_sendListener->SetComposeObj(this);
m_sendListener->SetDeliverMode(deliverMode);
sendListener->SetComposeObj(this);
sendListener->SetDeliverMode(deliverMode);
PRUint32 listeners;
nsIMsgSendListener **tArray = m_sendListener->CreateListenerArray(&listeners);
nsIMsgSendListener **tArray = sendListener->CreateListenerArray(&listeners);
if (!tArray)
{
#ifdef DEBUG

Просмотреть файл

@ -114,7 +114,6 @@ class nsMsgCompose : public nsIMsgCompose
// tell the doc state listeners that the doc state has changed
nsresult NotifyStateListeners(TStateListenerNotification aNotificationType);
nsMsgComposeSendListener *m_sendListener;
nsIEditorShell *m_editor;
nsIDOMWindowInternal *m_window;
nsCOMPtr<nsIBaseWindow> m_baseWindow;