Bug 1436902 part 1. Add a new NS_INLINE_DECL_REFCOUNTING_INHERITED macro that declares addref/release only for logging purposes. r=mccr8

MozReview-Commit-ID: JTT5RzJ7IVu
This commit is contained in:
Boris Zbarsky 2018-02-12 15:43:48 -05:00
parent 10ced4c995
commit f86a73ccc5

View File

@ -1128,25 +1128,31 @@ namespace mozilla {
class Runnable;
} // namespace mozilla
#define NS_IMPL_ADDREF_INHERITED(Class, Super) \
NS_IMETHODIMP_(MozExternalRefCountType) Class::AddRef(void) \
{ \
#define NS_IMPL_ADDREF_INHERITED_GUTS(Class, Super) \
MOZ_ASSERT_TYPE_OK_FOR_REFCOUNTING(Class) \
nsrefcnt r = Super::AddRef(); \
if (!mozilla::IsConvertible<Class*, mozilla::Runnable*>::value) { \
NS_LOG_ADDREF(this, r, #Class, sizeof(*this)); \
} \
return r; \
return r /* Purposefully no trailing semicolon */
#define NS_IMPL_ADDREF_INHERITED(Class, Super) \
NS_IMETHODIMP_(MozExternalRefCountType) Class::AddRef(void) \
{ \
NS_IMPL_ADDREF_INHERITED_GUTS(Class, Super); \
}
#define NS_IMPL_RELEASE_INHERITED(Class, Super) \
NS_IMETHODIMP_(MozExternalRefCountType) Class::Release(void) \
{ \
#define NS_IMPL_RELEASE_INHERITED_GUTS(Class, Super) \
nsrefcnt r = Super::Release(); \
if (!mozilla::IsConvertible<Class*, mozilla::Runnable*>::value) { \
NS_LOG_RELEASE(this, r, #Class); \
} \
return r; \
return r /* Purposefully no trailing semicolon */
#define NS_IMPL_RELEASE_INHERITED(Class, Super) \
NS_IMETHODIMP_(MozExternalRefCountType) Class::Release(void) \
{ \
NS_IMPL_RELEASE_INHERITED_GUTS(Class, Super); \
}
/**
@ -1209,6 +1215,25 @@ NS_IMETHODIMP_(MozExternalRefCountType) Class::Release(void) \
NS_IMPL_ADDREF_INHERITED(aClass, aSuper) \
NS_IMPL_RELEASE_INHERITED(aClass, aSuper)
/**
* A macro to declare and implement addref/release for a class that does not
* need to QI to any interfaces other than the ones its parent class QIs to.
* This can be a no-op when we're not building with refcount logging, because in
* that case there's no real reason to have a separate addref/release on this
* class.
*/
#if defined(NS_BUILD_REFCNT_LOGGING)
#define NS_INLINE_DECL_REFCOUNTING_INHERITED(Class, Super) \
NS_IMETHOD_(MozExternalRefCountType) AddRef() override { \
NS_IMPL_ADDREF_INHERITED_GUTS(Class, Super); \
} \
NS_IMETHOD_(MozExternalRefCountType) Release() override { \
NS_IMPL_RELEASE_INHERITED_GUTS(Class, Super); \
}
#else // NS_BUILD_REFCNT_LOGGING
#define NS_INLINE_DECL_REFCOUNTING_INHERITED(Class, Super)
#endif // NS_BUILD_REFCNT_LOGGINGx
/*
* Macro to glue together a QI that starts with an interface table
* and segues into an interface map (e.g. it uses singleton classinfo