cache most recent thread object asked for, should speed up painting of thread pane when in threaded mode, r=naving, sr=sspitzer 111976

This commit is contained in:
bienvenu%netscape.com 2001-11-27 03:53:31 +00:00
parent ca49da3bec
commit 8bba0f4250
2 changed files with 58 additions and 42 deletions

View File

@ -260,11 +260,12 @@ virtual nsresult AdjustExpungedBytesOnDelete(nsIMsgDBHdr *msgHdr);
nsresult RemoveHdrFromCache(nsIMsgDBHdr *hdr, nsMsgKey key);
// all headers currently instantiated, doesn't hold refs
// these get added when msg hdrs get constructed, and removed when they get destroyed.
nsresult GetHdrFromUseCache(nsMsgKey key, nsIMsgDBHdr* *result);
nsresult AddHdrToUseCache(nsIMsgDBHdr *hdr, nsMsgKey key);
nsresult ClearUseHdrCache();
nsresult RemoveHdrFromUseCache(nsIMsgDBHdr *hdr, nsMsgKey key);
nsresult GetHdrFromUseCache(nsMsgKey key, nsIMsgDBHdr* *result);
nsresult AddHdrToUseCache(nsIMsgDBHdr *hdr, nsMsgKey key);
nsresult ClearUseHdrCache();
nsresult RemoveHdrFromUseCache(nsIMsgDBHdr *hdr, nsMsgKey key);
void ClearCachedObjects();
// all instantiated headers, but doesn't hold refs.
PLDHashTable *m_headersInUse;
static const void* PR_CALLBACK GetKey(PLDHashTable* aTable, PLDHashEntryHdr* aEntry);
@ -281,7 +282,9 @@ virtual nsresult AdjustExpungedBytesOnDelete(nsIMsgDBHdr *msgHdr);
nsIMsgDBHdr *mHdr;
};
PLDHashTable *m_cachedHeaders;
PRBool m_bCacheHeaders;
PRBool m_bCacheHeaders;
nsMsgKey m_cachedThreadId;
nsCOMPtr <nsIMsgThread> m_cachedThread;
private:
PRUint32 m_cacheSize;

View File

@ -188,6 +188,21 @@ NS_IMETHODIMP nsMsgDatabase::ClearCachedHdrs()
return ClearHdrCache(PR_FALSE); // don't re-init, hope db gets closed.
}
void nsMsgDatabase::ClearCachedObjects()
{
ClearHdrCache(PR_FALSE);
#ifdef DEBUG_bienvenu
if (m_headersInUse && m_headersInUse->entryCount > 0)
{
NS_ASSERTION(PR_FALSE, "leaking headers");
printf("leaking %d headers in %s\n", m_headersInUse->entryCount, (const char *) m_dbName);
}
#endif
ClearUseHdrCache();
m_cachedThread = nsnull;
m_cachedThreadId = nsMsgKey_None;
}
nsresult nsMsgDatabase::ClearHdrCache(PRBool reInit)
{
if (m_cachedHeaders)
@ -686,7 +701,8 @@ nsMsgDatabase::nsMsgDatabase()
m_headersInUse(nsnull),
m_cachedHeaders(nsnull),
m_bCacheHeaders(PR_TRUE),
m_cacheSize(kMaxHdrsInCache)
m_cacheSize(kMaxHdrsInCache),
m_cachedThreadId(nsMsgKey_None)
{
NS_INIT_REFCNT();
@ -695,14 +711,9 @@ nsMsgDatabase::nsMsgDatabase()
nsMsgDatabase::~nsMsgDatabase()
{
// Close(FALSE); // better have already been closed.
ClearHdrCache(PR_FALSE);
#ifdef DEBUG_bienvenu1
NS_ASSERTION(!m_headersInUse || m_headersInUse->Count() == 0, "leaking headers");
#endif
ClearUseHdrCache();
delete m_cachedHeaders;
delete m_headersInUse;
ClearCachedObjects();
delete m_cachedHeaders;
delete m_headersInUse;
RemoveFromCache(this);
#ifdef DEBUG_bienvenu1
if (GetNumInCache() != 0)
@ -1019,15 +1030,7 @@ NS_IMETHODIMP nsMsgDatabase::ForceClosed()
NS_IF_RELEASE(m_dbFolderInfo);
err = CloseMDB(PR_FALSE); // since we're about to delete it, no need to commit.
ClearHdrCache(PR_FALSE);
#ifdef DEBUG_bienvenu
if (m_headersInUse && m_headersInUse->entryCount > 0)
{
NS_ASSERTION(PR_FALSE, "leaking headers");
printf("leaking %d headers in %s\n", m_headersInUse->entryCount, (const char *) m_dbName);
}
#endif
ClearUseHdrCache();
ClearCachedObjects();
if (m_mdbAllMsgHeadersTable)
{
m_mdbAllMsgHeadersTable->Release();
@ -3461,25 +3464,35 @@ nsresult nsMsgDatabase::GetThreadForMsgKey(nsMsgKey msgKey, nsIMsgThread **resul
// caller needs to unrefer.
nsIMsgThread * nsMsgDatabase::GetThreadForThreadId(nsMsgKey threadId)
{
nsMsgThread *pThread = nsnull;
if (m_mdbStore)
{
mdbOid tableId;
tableId.mOid_Id = threadId;
tableId.mOid_Scope = m_hdrRowScopeToken;
nsIMdbTable *threadTable;
mdb_err res = m_mdbStore->GetTable(GetEnv(), &tableId, &threadTable);
if (NS_SUCCEEDED(res) && threadTable)
{
pThread = new nsMsgThread(this, threadTable);
if(pThread)
NS_ADDREF(pThread);
}
}
return pThread;
if (threadId == m_cachedThreadId && m_cachedThread)
{
nsIMsgThread *retThread = m_cachedThread;
NS_ADDREF(retThread);
return retThread;
}
nsMsgThread *pThread = nsnull;
if (m_mdbStore)
{
mdbOid tableId;
tableId.mOid_Id = threadId;
tableId.mOid_Scope = m_hdrRowScopeToken;
nsIMdbTable *threadTable;
mdb_err res = m_mdbStore->GetTable(GetEnv(), &tableId, &threadTable);
if (NS_SUCCEEDED(res) && threadTable)
{
pThread = new nsMsgThread(this, threadTable);
if(pThread)
{
NS_ADDREF(pThread);
m_cachedThread = pThread;
m_cachedThreadId = threadId;
}
}
}
return pThread;
}
// make the passed in header a thread header