fix crash in morkRow::closerow object r=naving, sr=mscott 104659

This commit is contained in:
bienvenu%netscape.com 2002-02-02 16:57:25 +00:00
Родитель cc5252cce0
Коммит 02e0c2e5cc
2 изменённых файлов: 40 добавлений и 12 удалений

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

@ -275,6 +275,8 @@ virtual nsresult AdjustExpungedBytesOnDelete(nsIMsgDBHdr *msgHdr);
static void PR_CALLBACK ClearEntry(PLDHashTable* aTable, PLDHashEntryHdr* aEntry); static void PR_CALLBACK ClearEntry(PLDHashTable* aTable, PLDHashEntryHdr* aEntry);
static PLDHashOperator PR_CALLBACK HeaderEnumerator (PLDHashTable *table, PLDHashEntryHdr *hdr, static PLDHashOperator PR_CALLBACK HeaderEnumerator (PLDHashTable *table, PLDHashEntryHdr *hdr,
PRUint32 number, void *arg); PRUint32 number, void *arg);
static PLDHashOperator PR_CALLBACK ClearHeaderEnumerator (PLDHashTable *table, PLDHashEntryHdr *hdr,
PRUint32 number, void *arg);
static PLDHashTableOps gMsgDBHashTableOps; static PLDHashTableOps gMsgDBHashTableOps;
struct MsgHdrHashElement { struct MsgHdrHashElement {
PLDHashEntryHdr mHeader; PLDHashEntryHdr mHeader;

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

@ -169,6 +169,22 @@ nsresult nsMsgDatabase::AddHdrToCache(nsIMsgDBHdr *hdr, nsMsgKey key) // do we w
return PL_DHASH_NEXT; return PL_DHASH_NEXT;
} }
/* static */PLDHashOperator PR_CALLBACK nsMsgDatabase::ClearHeaderEnumerator (PLDHashTable *table, PLDHashEntryHdr *hdr,
PRUint32 number, void *arg)
{
MsgHdrHashElement* element = NS_REINTERPRET_CAST(MsgHdrHashElement*, hdr);
if (element && element->mHdr)
{
nsMsgHdr* msgHdr = NS_STATIC_CAST(nsMsgHdr*, element->mHdr); // closed system, so this is ok
// clear out m_mdbRow member variable - the db is going away, which means that this member
// variable might very well point to a mork db that is gone.
msgHdr->m_mdbRow = nsnull;
}
return PL_DHASH_NEXT;
}
NS_IMETHODIMP nsMsgDatabase::SetMsgHdrCacheSize(PRUint32 aSize) NS_IMETHODIMP nsMsgDatabase::SetMsgHdrCacheSize(PRUint32 aSize)
{ {
m_cacheSize = aSize; m_cacheSize = aSize;
@ -185,6 +201,13 @@ NS_IMETHODIMP nsMsgDatabase::GetMsgHdrCacheSize(PRUint32 *aSize)
NS_IMETHODIMP nsMsgDatabase::ClearCachedHdrs() NS_IMETHODIMP nsMsgDatabase::ClearCachedHdrs()
{ {
ClearCachedObjects(); ClearCachedObjects();
#ifdef DEBUG_bienvenu
if (mRefCnt > 1)
{
NS_ASSERTION(PR_FALSE, "");
printf("someone's holding onto db - refs = %ld\n", mRefCnt);
}
#endif
return NS_OK; return NS_OK;
} }
@ -366,12 +389,15 @@ nsresult nsMsgDatabase::AddHdrToUseCache(nsIMsgDBHdr *hdr, nsMsgKey key)
nsresult nsMsgDatabase::ClearUseHdrCache() nsresult nsMsgDatabase::ClearUseHdrCache()
{ {
if (m_headersInUse) if (m_headersInUse)
{ {
// clear mdb row pointers of any headers still in use, because the
// underlying db is going away.
PL_DHashTableEnumerate(m_headersInUse, ClearHeaderEnumerator, nsnull);
PL_DHashTableDestroy(m_headersInUse); PL_DHashTableDestroy(m_headersInUse);
m_headersInUse = nsnull; m_headersInUse = nsnull;
} }
return NS_OK; return NS_OK;
} }
nsresult nsMsgDatabase::RemoveHdrFromUseCache(nsIMsgDBHdr *hdr, nsMsgKey key) nsresult nsMsgDatabase::RemoveHdrFromUseCache(nsIMsgDBHdr *hdr, nsMsgKey key)
@ -1772,14 +1798,14 @@ nsMsgDatabase::MarkThreadWatched(nsIMsgThread *thread, nsMsgKey threadKey, PRBoo
PRUint32 threadFlags; PRUint32 threadFlags;
thread->GetFlags(&threadFlags); thread->GetFlags(&threadFlags);
PRUint32 oldThreadFlags = threadFlags; // not quite right, since we probably want msg hdr flags. PRUint32 oldThreadFlags = threadFlags; // not quite right, since we probably want msg hdr flags.
if (bWatched) if (bWatched)
{ {
threadFlags |= MSG_FLAG_WATCHED; threadFlags |= MSG_FLAG_WATCHED;
threadFlags &= ~MSG_FLAG_IGNORED; // watch is implicit un-ignore threadFlags &= ~MSG_FLAG_IGNORED; // watch is implicit un-ignore
} }
else else
threadFlags &= ~MSG_FLAG_WATCHED; threadFlags &= ~MSG_FLAG_WATCHED;
NotifyKeyChangeAll(threadKey, oldThreadFlags, threadFlags, instigator); NotifyKeyChangeAll(threadKey, oldThreadFlags, threadFlags, instigator);
thread->SetFlags(threadFlags); thread->SetFlags(threadFlags);
return NS_OK; return NS_OK;
} }