1. remove extra monitors (47825)

2.  add method to determine if manager has been shutdown  (44680)
3.  Add nsCOMPtr to avoid leak  (44680, 43244)

r=valeski@netscape.com
This commit is contained in:
dougt%netscape.com 2000-08-07 20:50:25 +00:00
parent bb06aba776
commit 283ecd2375
4 changed files with 25 additions and 16 deletions

View File

@ -196,12 +196,14 @@ nsProxyEventClass::~nsProxyEventClass()
if(mDescriptors && mDescriptors != &zero_methods_descriptor)
delete [] mDescriptors;
if (nsProxyObjectManager::IsManagerShutdown())
return;
#ifndef LIFETIME_CACHE
nsIDKey key(mIID);
nsProxyObjectManager *manager = nsProxyObjectManager::GetInstance();
nsCOMPtr<nsProxyObjectManager> manager = getter_AddRefs(nsProxyObjectManager::GetInstance());
if (manager == nsnull) return;
nsAutoLock lock(manager->GetMapLock());
nsHashtable *iidToClassMap = manager->GetIIDToProxyClassMap();
if (iidToClassMap != nsnull)

View File

@ -146,7 +146,6 @@ nsProxyEventObject::GetNewOrUsedProxy(nsIEventQueue *destQueue,
/* get our hash table */
nsProxyObjectManager *manager = nsProxyObjectManager::GetInstance();
if (manager == nsnull) return nsnull;
nsAutoLock lock(manager->GetMapLock());
nsHashtable *realToProxyMap = manager->GetRealObjectToProxyObjectMap();
if (realToProxyMap == nsnull) return nsnull;
@ -321,15 +320,17 @@ DebugDump("Delete", 0);
}
else
{
nsProxyObjectManager *manager = nsProxyObjectManager::GetInstance();
nsAutoLock lock(manager->GetMapLock());
nsHashtable *realToProxyMap = manager->GetRealObjectToProxyObjectMap();
if (realToProxyMap != nsnull && mHashKey.HashValue() != 0)
if (! nsProxyObjectManager::IsManagerShutdown())
{
realToProxyMap->Remove(&mHashKey);
nsCOMPtr<nsProxyObjectManager> manager = nsProxyObjectManager::GetInstance();
nsHashtable *realToProxyMap = manager->GetRealObjectToProxyObjectMap();
if (realToProxyMap != nsnull && mHashKey.HashValue() != 0)
{
realToProxyMap->Remove(&mHashKey);
}
}
}
}
// I am worried about ordering.
// do not remove assignments.
mProxyObject = 0;

View File

@ -168,15 +168,15 @@ public:
virtual ~nsProxyObjectManager();
static nsProxyObjectManager *GetInstance();
static PRBool IsManagerShutdown();
PRLock* GetMapLock() const { return mMapLock; }
nsHashtable* GetRealObjectToProxyObjectMap() const { return mProxyObjectMap;}
nsHashtable* GetIIDToProxyClassMap() const { return mProxyClassMap; }
private:
static nsProxyObjectManager* mInstance;
PRLock* mMapLock;
nsHashtable *mProxyObjectMap;
nsHashtable *mProxyClassMap;
};

View File

@ -93,7 +93,6 @@ nsProxyObjectManager::nsProxyObjectManager()
{
NS_INIT_REFCNT();
mMapLock = PR_NewLock();
mProxyClassMap = new nsHashtable(256, PR_TRUE);
mProxyObjectMap = new nsHashtable(256, PR_TRUE);
}
@ -112,10 +111,17 @@ nsProxyObjectManager::~nsProxyObjectManager()
mProxyClassMap->Reset((nsHashtableEnumFunc)PurgeProxyClasses, nsnull);
delete mProxyClassMap;
}
delete mProxyObjectMap;
nsProxyObjectManager::mInstance = nsnull;
PR_DestroyLock(mMapLock);
}
PRBool
nsProxyObjectManager::IsManagerShutdown()
{
if (mInstance)
return PR_FALSE;
return PR_TRUE;
}
nsProxyObjectManager *