Fix threadsafety regression so we're back to the old broken state. b=335734 r=sicking rs=brendan

This commit is contained in:
dbaron%dbaron.org 2006-05-06 17:49:21 +00:00
Родитель 11521580d2
Коммит 0c9372c940
2 изменённых файлов: 27 добавлений и 2 удалений

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

@ -397,7 +397,7 @@ AtomImpl::~AtomImpl()
// Permanent atoms are removed from the hashtable at shutdown, and we
// don't want to remove them twice. See comment above in
// |AtomTableClearEntry|.
if (!IsPermanent()) {
if (!IsPermanentInDestructor()) {
AtomTableEntry key(mString);
PL_DHashTableOperate(&gAtomTable, &key, PL_DHASH_REMOVE);
if (gAtomTable.entryCount == 0) {
@ -413,6 +413,11 @@ NS_IMPL_THREADSAFE_ISUPPORTS1(AtomImpl, nsIAtom)
PermanentAtomImpl::PermanentAtomImpl()
: AtomImpl()
{
}
PermanentAtomImpl::~PermanentAtomImpl()
{
// So we can tell if we were permanent while running the base class dtor.
mRefCnt = REFCNT_PERMANENT_SENTINEL;
}
@ -426,6 +431,18 @@ NS_IMETHODIMP_(nsrefcnt) PermanentAtomImpl::Release()
return 1;
}
/* virtual */ PRBool
AtomImpl::IsPermanent()
{
return PR_FALSE;
}
/* virtual */ PRBool
PermanentAtomImpl::IsPermanent()
{
return PR_TRUE;
}
void* AtomImpl::operator new ( size_t size, const nsACString& aString ) CPP_THROW_NEW
{
/*

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

@ -61,7 +61,12 @@ public:
enum { REFCNT_PERMANENT_SENTINEL = PR_UINT32_MAX };
PRBool IsPermanent() { return mRefCnt == REFCNT_PERMANENT_SENTINEL; }
virtual PRBool IsPermanent();
// We can't use the virtual function in the base class destructor.
PRBool IsPermanentInDestructor() {
return mRefCnt == REFCNT_PERMANENT_SENTINEL;
}
void* operator new(size_t size, const nsACString& aString) CPP_THROW_NEW;
@ -84,9 +89,12 @@ public:
class PermanentAtomImpl : public AtomImpl {
public:
PermanentAtomImpl();
~PermanentAtomImpl();
NS_IMETHOD_(nsrefcnt) AddRef();
NS_IMETHOD_(nsrefcnt) Release();
virtual PRBool IsPermanent();
void* operator new(size_t size, const nsACString& aString) CPP_THROW_NEW {
return AtomImpl::operator new(size, aString);
}