Impressum AtomicRefCountedWithFinalize.h
Sprache: C
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
void Release() {
MOZ_ASSERT(mRefCount > 0, "Release() during/after Finalize()/dtor."); // Read mRecycleCallback early so that it does not get set to // deleted memory, if the object is goes away. See bug 994903. // This saves us in the case where there is no callback, so that // we can do the "else if" below.
RecycleCallback recycleCallback = mRecycleCallback; int currCount = --mRefCount; if (currCount < 0) {
gfxCriticalError() << "Invalid reference count release" << currCount;
++mRefCount; return;
} #ifdef NS_BUILD_REFCNT_LOGGING
NS_LOG_RELEASE(this, currCount, mName); #endif
if (0 == currCount) {
mRefCount = detail::DEAD;
MOZ_ASSERT(IsDead());
// Recycle listeners must call ClearRecycleCallback // before releasing their strong reference. if (mRecycleCallback) {
gfxCriticalError() << "About to release with valid callback";
mRecycleCallback = nullptr;
}
MOZ_ASSERT(mManualAddRefs == mManualReleases);
T* derived = static_cast<T*>(this);
derived->Finalize(); delete derived;
} elseif (1 == currCount && recycleCallback) { // There is nothing enforcing this in the code, except how the callers // are being careful to never let the reference count go down if there // is a callback.
MOZ_ASSERT(!IsDead());
T* derived = static_cast<T*>(this);
recycleCallback(derived, mClosure);
}
}
public: typedefvoid (*RecycleCallback)(T* aObject, void* aClosure); /** * Set a callback responsible for recycling this object * before it is finalized.
*/ void SetRecycleCallback(RecycleCallback aCallback, void* aClosure) {
MOZ_ASSERT(!IsDead());
mRecycleCallback = aCallback;
mClosure = aClosure;
} void ClearRecycleCallback() {
MOZ_ASSERT(!IsDead());
SetRecycleCallback(nullptr, nullptr);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.