forked from mirrors/gecko-dev
Bug 1882698 - Fix ref counting in nsAutoOwningEventTarget; r=xpcom-reviewers,nika
Differential Revision: https://phabricator.services.mozilla.com/D203280
This commit is contained in:
parent
efa07125ed
commit
142346befd
3 changed files with 32 additions and 5 deletions
|
|
@ -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())) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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 =
|
||||
|
|
|
|||
Loading…
Reference in a new issue