Bug 1882698 - Fix ref counting in nsAutoOwningEventTarget; r=xpcom-reviewers,nika

Differential Revision: https://phabricator.services.mozilla.com/D203280
This commit is contained in:
Jan Varga 2024-03-14 08:51:56 +00:00
parent efa07125ed
commit 142346befd
3 changed files with 32 additions and 5 deletions

View file

@ -50,13 +50,25 @@ bool nsAutoOwningThread::IsCurrentThread() const {
nsAutoOwningEventTarget::nsAutoOwningEventTarget()
: mTarget(GetCurrentSerialEventTarget()) {
mTarget->AddRef();
NS_ADDREF(mTarget);
}
nsAutoOwningEventTarget::~nsAutoOwningEventTarget() {
nsCOMPtr<nsISerialEventTarget> target = dont_AddRef(mTarget);
nsAutoOwningEventTarget::nsAutoOwningEventTarget(
const nsAutoOwningEventTarget& aOther)
: mTarget(aOther.mTarget) {
NS_ADDREF(mTarget);
}
nsAutoOwningEventTarget& nsAutoOwningEventTarget::operator=(
const nsAutoOwningEventTarget& aRhs) {
nsISerialEventTarget* previous = std::exchange(mTarget, aRhs.mTarget);
NS_ADDREF(mTarget);
NS_RELEASE(previous);
return *this;
}
nsAutoOwningEventTarget::~nsAutoOwningEventTarget() { NS_RELEASE(mTarget); }
void nsAutoOwningEventTarget ::AssertCurrentThreadOwnsMe(
const char* msg) const {
if (MOZ_UNLIKELY(!IsCurrentThread())) {

View file

@ -71,6 +71,20 @@ class nsISerialEventTarget;
class nsAutoOwningEventTarget {
public:
nsAutoOwningEventTarget();
nsAutoOwningEventTarget(const nsAutoOwningEventTarget& aOther);
// Per https://en.cppreference.com/w/cpp/language/move_constructor
// there's no implicitly-declared move constructor if there are user-declared
// copy constructors, and we have one, immediately above.
nsAutoOwningEventTarget& operator=(const nsAutoOwningEventTarget& aRhs);
// Per https://en.cppreference.com/w/cpp/language/move_assignment
// there's no implicitly-declared move assignment operator if there are
// user-declared copy assignment operators, and we have one, immediately
// above.
~nsAutoOwningEventTarget();
// We move the actual assertion checks out-of-line to minimize code bloat,
@ -88,6 +102,7 @@ class nsAutoOwningEventTarget {
private:
void AssertCurrentThreadOwnsMe(const char* aMsg) const;
// A raw pointer to avoid nsCOMPtr.h dependency.
nsISerialEventTarget* mTarget;
};

View file

@ -70,7 +70,7 @@ void CheckAutoOwningEventTarget(
} // namespace
TEST(TestAutoOwningEventTarget, DISABLED_Simple)
TEST(TestAutoOwningEventTarget, Simple)
{
{
nsAutoOwningEventTarget autoOwningEventTarget;
@ -81,7 +81,7 @@ TEST(TestAutoOwningEventTarget, DISABLED_Simple)
}
}
TEST(TestAutoOwningEventTarget, DISABLED_TaskQueue)
TEST(TestAutoOwningEventTarget, TaskQueue)
{
nsresult rv;
nsCOMPtr<nsIEventTarget> threadPool =