Fix for bugs 14786 and 13727. Fix leaking nsIServiceManager and datasources. Approved by chofmann

and reviewed by alecf.


git-svn-id: svn://10.0.0.236/trunk@49011 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
putterman%netscape.com 1999-09-24 21:59:45 +00:00
parent 5998553524
commit 3d7ff9d3d0
6 changed files with 65 additions and 58 deletions

View File

@ -99,7 +99,8 @@ protected:
static nsIRDFResource* kNC_PageTitleCopies;
static nsIRDFResource* kNC_PageTitleAdvanced;
static nsIRDFResource* kNC_PageTitleSMTP;
static nsrefcnt gAccountManagerResourceRefCnt;
private:
// enumeration function to convert each server (element)
@ -135,6 +136,8 @@ nsIRDFResource* nsMsgAccountManagerDataSource::kNC_PageTitleCopies=nsnull;
nsIRDFResource* nsMsgAccountManagerDataSource::kNC_PageTitleAdvanced=nsnull;
nsIRDFResource* nsMsgAccountManagerDataSource::kNC_PageTitleSMTP=nsnull;
nsrefcnt nsMsgAccountManagerDataSource::gAccountManagerResourceRefCnt = 0;
// RDF to match
#define NC_RDF_ACCOUNT NC_NAMESPACE_URI "Account"
#define NC_RDF_SERVER NC_NAMESPACE_URI "Server"
@ -161,9 +164,27 @@ nsMsgAccountManagerDataSource::nsMsgAccountManagerDataSource():
nsMsgAccountManagerDataSource::~nsMsgAccountManagerDataSource()
{
if (getRDFService()) nsServiceManager::ReleaseService(kRDFServiceCID,
getRDFService(),
this);
if (--gAccountManagerResourceRefCnt == 0)
{
NS_IF_RELEASE(kNC_Child);
NS_IF_RELEASE(kNC_Name);
NS_IF_RELEASE(kNC_NameSort);
NS_IF_RELEASE(kNC_PageTag);
NS_IF_RELEASE(kNC_Account);
NS_IF_RELEASE(kNC_Server);
NS_IF_RELEASE(kNC_Identity);
NS_IF_RELEASE(kNC_PageTitleMain);
NS_IF_RELEASE(kNC_PageTitleServer);
NS_IF_RELEASE(kNC_PageTitleCopies);
NS_IF_RELEASE(kNC_PageTitleAdvanced);
NS_IF_RELEASE(kNC_PageTitleSMTP);
NS_IF_RELEASE(kNC_AccountRoot);
// eventually these need to exist in some kind of array
// that's easily extensible
NS_IF_RELEASE(kNC_Settings);
}
}
@ -182,7 +203,7 @@ nsMsgAccountManagerDataSource::Init()
if (NS_FAILED(rv)) return rv;
}
if (! kNC_Child) {
if (gAccountManagerResourceRefCnt++ == 0) {
getRDFService()->GetResource(NC_RDF_CHILD, &kNC_Child);
getRDFService()->GetResource(NC_RDF_NAME, &kNC_Name);
getRDFService()->GetResource(NC_RDF_NAME_SORT, &kNC_NameSort);

View File

@ -70,6 +70,7 @@ nsIRDFResource* nsMsgFolderDataSource::kNC_Compact= nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_Rename= nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_EmptyTrash= nsnull;
nsrefcnt nsMsgFolderDataSource::gFolderResourceRefCnt = 0;
nsMsgFolderDataSource::nsMsgFolderDataSource():
mInitialized(PR_FALSE)
@ -81,33 +82,35 @@ nsMsgFolderDataSource::~nsMsgFolderDataSource (void)
{
nsresult rv;
NS_WITH_SERVICE(nsIMsgMailSession, mailSession, kMsgMailSessionCID, &rv);
NS_WITH_SERVICE(nsIMsgMailSession, mailSession, kMsgMailSessionCID, &rv);
if(NS_SUCCEEDED(rv))
mailSession->RemoveFolderListener(this);
if (--gFolderResourceRefCnt == 0)
{
nsrefcnt refcnt;
NS_RELEASE2(kNC_Child, refcnt);
NS_RELEASE2(kNC_MessageChild, refcnt);
NS_RELEASE2(kNC_Folder, refcnt);
NS_RELEASE2(kNC_Name, refcnt);
NS_RELEASE2(kNC_NameSort, refcnt);
NS_RELEASE2(kNC_SpecialFolder, refcnt);
NS_RELEASE2(kNC_ServerType, refcnt);
NS_RELEASE2(kNC_IsServer, refcnt);
NS_RELEASE2(kNC_TotalMessages, refcnt);
NS_RELEASE2(kNC_TotalUnreadMessages, refcnt);
NS_RELEASE2(kNC_Charset, refcnt);
NS_RELEASE2(kNC_BiffState, refcnt);
nsrefcnt refcnt;
NS_RELEASE2(kNC_Child, refcnt);
NS_RELEASE2(kNC_MessageChild, refcnt);
NS_RELEASE2(kNC_Folder, refcnt);
NS_RELEASE2(kNC_Name, refcnt);
NS_RELEASE2(kNC_NameSort, refcnt);
NS_RELEASE2(kNC_SpecialFolder, refcnt);
NS_RELEASE2(kNC_ServerType, refcnt);
NS_RELEASE2(kNC_IsServer, refcnt);
NS_RELEASE2(kNC_TotalMessages, refcnt);
NS_RELEASE2(kNC_TotalUnreadMessages, refcnt);
NS_RELEASE2(kNC_Charset, refcnt);
NS_RELEASE2(kNC_BiffState, refcnt);
NS_RELEASE2(kNC_Delete, refcnt);
NS_RELEASE2(kNC_NewFolder, refcnt);
NS_RELEASE2(kNC_GetNewMessages, refcnt);
NS_RELEASE2(kNC_Copy, refcnt);
NS_RELEASE2(kNC_Move, refcnt);
NS_RELEASE2(kNC_MarkAllMessagesRead, refcnt);
NS_RELEASE2(kNC_Compact, refcnt);
NS_RELEASE2(kNC_Rename, refcnt);
NS_RELEASE2(kNC_EmptyTrash, refcnt);
NS_RELEASE2(kNC_Delete, refcnt);
NS_RELEASE2(kNC_NewFolder, refcnt);
NS_RELEASE2(kNC_GetNewMessages, refcnt);
NS_RELEASE2(kNC_Copy, refcnt);
NS_RELEASE2(kNC_Move, refcnt);
NS_RELEASE2(kNC_MarkAllMessagesRead, refcnt);
NS_RELEASE2(kNC_Compact, refcnt);
NS_RELEASE2(kNC_Rename, refcnt);
NS_RELEASE2(kNC_EmptyTrash, refcnt);
}
}
@ -126,7 +129,7 @@ nsresult nsMsgFolderDataSource::Init()
if(!rdf)
return NS_ERROR_FAILURE;
if (! kNC_Child) {
if (gFolderResourceRefCnt++ == 0) {
rdf->GetResource(NC_RDF_CHILD, &kNC_Child);
rdf->GetResource(NC_RDF_MESSAGECHILD, &kNC_MessageChild);
rdf->GetResource(NC_RDF_FOLDER, &kNC_Folder);

View File

@ -176,6 +176,8 @@ protected:
static nsIRDFResource* kNC_Rename;
static nsIRDFResource* kNC_EmptyTrash;
static nsrefcnt gFolderResourceRefCnt;
nsCOMPtr<nsISupportsArray> kFolderArcsOutArray;
};

View File

@ -66,6 +66,8 @@ nsIRDFResource* nsMsgMessageDataSource::kNC_ToggleRead= nsnull;
nsIRDFResource* nsMsgMessageDataSource::kNC_MarkFlagged= nsnull;
nsIRDFResource* nsMsgMessageDataSource::kNC_MarkUnflagged= nsnull;
nsrefcnt nsMsgMessageDataSource::gMessageResourceRefCnt = 0;
nsMsgMessageDataSource::nsMsgMessageDataSource():
mInitialized(PR_FALSE),
@ -78,52 +80,34 @@ nsMsgMessageDataSource::nsMsgMessageDataSource():
nsMsgMessageDataSource::~nsMsgMessageDataSource (void)
{
nsresult rv;
nsIRDFService *rdf = getRDFService();
if(rdf)
rdf->UnregisterDataSource(this);
NS_WITH_SERVICE(nsIMsgMailSession, mailSession, kMsgMailSessionCID, &rv);
if(NS_SUCCEEDED(rv))
mailSession->RemoveFolderListener(this);
if (--gMessageResourceRefCnt == 0)
{
nsrefcnt refcnt;
nsrefcnt refcnt;
if (kNC_Subject)
NS_RELEASE2(kNC_Subject, refcnt);
if (kNC_SubjectCollation)
NS_RELEASE2(kNC_SubjectCollation, refcnt);
if (kNC_Sender)
NS_RELEASE2(kNC_Sender, refcnt);
if (kNC_SenderCollation)
NS_RELEASE2(kNC_SenderCollation, refcnt);
if (kNC_Date)
NS_RELEASE2(kNC_Date, refcnt);
if (kNC_Status)
NS_RELEASE2(kNC_Status, refcnt);
if (kNC_Flagged)
NS_RELEASE2(kNC_Flagged, refcnt);
if (kNC_Priority)
NS_RELEASE2(kNC_Priority, refcnt);
if (kNC_Size)
NS_RELEASE2(kNC_Size, refcnt);
if (kNC_Total)
NS_RELEASE2(kNC_Total, refcnt);
if (kNC_Unread)
NS_RELEASE2(kNC_Unread, refcnt);
if (kNC_MessageChild)
NS_RELEASE2(kNC_MessageChild, refcnt);
if (kNC_MarkRead)
NS_RELEASE2(kNC_MarkRead, refcnt);
if (kNC_MarkUnread)
NS_RELEASE2(kNC_MarkUnread, refcnt);
if (kNC_ToggleRead)
NS_RELEASE2(kNC_ToggleRead, refcnt);
if (kNC_MarkRead)
NS_RELEASE2(kNC_MarkFlagged, refcnt);
if (kNC_MarkUnread)
NS_RELEASE2(kNC_MarkUnflagged, refcnt);
}
NS_IF_RELEASE(mHeaderParser);
}
@ -151,7 +135,7 @@ nsresult nsMsgMessageDataSource::Init()
if(NS_SUCCEEDED(rv))
mailSession->AddFolderListener(this);
PR_ASSERT(NS_SUCCEEDED(rv));
if (! kNC_Subject) {
if (gMessageResourceRefCnt++ == 0) {
rdf->GetResource(NC_RDF_SUBJECT, &kNC_Subject);
rdf->GetResource(NC_RDF_SUBJECT_COLLATION_SORT, &kNC_SubjectCollation);

View File

@ -200,6 +200,8 @@ protected:
nsCOMPtr<nsISupportsArray> kThreadsArcsOutArray;
nsCOMPtr<nsISupportsArray> kNoThreadsArcsOutArray;
static nsrefcnt gMessageResourceRefCnt;
};
PR_EXTERN(nsresult)

View File

@ -80,7 +80,6 @@ public:
nsCID mClassID;
char* mClassName;
char* mProgID;
nsIServiceManager* mServiceManager;
};
nsMsgComposeFactory::nsMsgComposeFactory(const nsCID &aClass,
@ -93,16 +92,12 @@ nsMsgComposeFactory::nsMsgComposeFactory(const nsCID &aClass,
{
NS_INIT_REFCNT();
// store a copy of the
compMgrSupports->QueryInterface(nsCOMTypeInfo<nsIServiceManager>::GetIID(),
(void **)&mServiceManager);
}
nsMsgComposeFactory::~nsMsgComposeFactory()
{
NS_ASSERTION(mRefCnt == 0, "non-zero refcnt at destruction");
NS_IF_RELEASE(mServiceManager);
PL_strfree(mClassName);
PL_strfree(mProgID);
}