fune/xpcom/base/nsInterfaceRequestorAgg.cpp
Nika Layzell 852d02ec16 Bug 1809753 - Part 3: Replace all callers of GetCurrentEventTarget with GetCurrentSerialEventTarget, r=mccr8,necko-reviewers,valentin
This only changes the behaviour when called with a TaskQueue or other type
using SerialEventTargetGuard on the stack. They are being switched over as the
existing GetCurrentEventTarget method is being removed, as it is somewhat
confusing, and poorly documented.

Callers which need to get the current thread even when on a threadpool or
behind a TaskQueue were switched to GetCurrentEventTarget in the previous part.

Differential Revision: https://phabricator.services.mozilla.com/D166607
2023-01-16 23:14:11 +00:00

74 lines
2.6 KiB
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/. */
#include "nsInterfaceRequestorAgg.h"
#include "nsIInterfaceRequestor.h"
#include "nsCOMPtr.h"
#include "mozilla/Attributes.h"
#include "nsThreadUtils.h"
#include "nsProxyRelease.h"
class nsInterfaceRequestorAgg final : public nsIInterfaceRequestor {
public:
// XXX This needs to support threadsafe refcounting until we fix bug 243591.
NS_DECL_THREADSAFE_ISUPPORTS
NS_DECL_NSIINTERFACEREQUESTOR
nsInterfaceRequestorAgg(nsIInterfaceRequestor* aFirst,
nsIInterfaceRequestor* aSecond,
nsIEventTarget* aConsumerTarget = nullptr)
: mFirst(aFirst), mSecond(aSecond), mConsumerTarget(aConsumerTarget) {
if (!mConsumerTarget) {
mConsumerTarget = mozilla::GetCurrentSerialEventTarget();
}
}
private:
~nsInterfaceRequestorAgg();
nsCOMPtr<nsIInterfaceRequestor> mFirst, mSecond;
nsCOMPtr<nsIEventTarget> mConsumerTarget;
};
NS_IMPL_ISUPPORTS(nsInterfaceRequestorAgg, nsIInterfaceRequestor)
NS_IMETHODIMP
nsInterfaceRequestorAgg::GetInterface(const nsIID& aIID, void** aResult) {
nsresult rv = NS_ERROR_NO_INTERFACE;
if (mFirst) {
rv = mFirst->GetInterface(aIID, aResult);
}
if (mSecond && NS_FAILED(rv)) {
rv = mSecond->GetInterface(aIID, aResult);
}
return rv;
}
nsInterfaceRequestorAgg::~nsInterfaceRequestorAgg() {
NS_ProxyRelease("nsInterfaceRequestorAgg::mFirst", mConsumerTarget,
mFirst.forget());
NS_ProxyRelease("nsInterfaceRequestorAgg::mSecond", mConsumerTarget,
mSecond.forget());
}
nsresult NS_NewInterfaceRequestorAggregation(nsIInterfaceRequestor* aFirst,
nsIInterfaceRequestor* aSecond,
nsIInterfaceRequestor** aResult) {
*aResult = new nsInterfaceRequestorAgg(aFirst, aSecond);
NS_ADDREF(*aResult);
return NS_OK;
}
nsresult NS_NewInterfaceRequestorAggregation(nsIInterfaceRequestor* aFirst,
nsIInterfaceRequestor* aSecond,
nsIEventTarget* aTarget,
nsIInterfaceRequestor** aResult) {
*aResult = new nsInterfaceRequestorAgg(aFirst, aSecond, aTarget);
NS_ADDREF(*aResult);
return NS_OK;
}