Bug 1361263 - allow InvokeAsync() to accept a member function which is pass-by-reference.
StoreCopyPassByRRef<> ensures a copy is stored in the runnable.
We don't have to worry about the concern of
bug 1300476.
MozReview-Commit-ID: DHqlzlVLBFV
--- a/dom/media/MediaDecoderReaderWrapper.cpp
+++ b/dom/media/MediaDecoderReaderWrapper.cpp
@@ -65,34 +65,34 @@ MediaDecoderReaderWrapper::RequestVideoD
MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
MOZ_ASSERT(!mShutdown);
if (aTimeThreshold > media::TimeUnit::Zero()) {
aTimeThreshold += StartTime();
}
int64_t startTime = StartTime().ToMicroseconds();
- return InvokeAsync<bool, media::TimeUnit&&>(
+ return InvokeAsync(
mReader->OwnerThread(), mReader.get(), __func__,
&MediaDecoderReader::RequestVideoData,
aSkipToNextKeyframe, aTimeThreshold)
->Then(mOwnerThread, __func__,
[startTime] (VideoData* aVideo) {
aVideo->AdjustForStartTime(startTime);
},
[] (const MediaResult& aError) {});
}
RefPtr<MediaDecoderReader::SeekPromise>
MediaDecoderReaderWrapper::Seek(const SeekTarget& aTarget)
{
MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
SeekTarget adjustedTarget = aTarget;
adjustedTarget.SetTime(adjustedTarget.GetTime() + StartTime());
- return InvokeAsync<SeekTarget&&>(
+ return InvokeAsync(
mReader->OwnerThread(), mReader.get(), __func__,
&MediaDecoderReader::Seek,
Move(adjustedTarget));
}
RefPtr<MediaDecoderReaderWrapper::WaitForDataPromise>
MediaDecoderReaderWrapper::WaitForData(MediaData::Type aType)
{
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -3136,17 +3136,17 @@ MediaDecoderStateMachine::Seek(const See
MOZ_ASSERT(mDuration.Ref().isSome(), "We should have got duration already");
return mStateObj->HandleSeek(aTarget);
}
RefPtr<MediaDecoder::SeekPromise>
MediaDecoderStateMachine::InvokeSeek(const SeekTarget& aTarget)
{
- return InvokeAsync<SeekTarget&&>(
+ return InvokeAsync(
OwnerThread(), this, __func__,
&MediaDecoderStateMachine::Seek, aTarget);
}
void MediaDecoderStateMachine::StopMediaSink()
{
MOZ_ASSERT(OnTaskQueue());
if (mMediaSink->IsStarted()) {
--- a/dom/media/mediasource/MediaSourceDemuxer.cpp
+++ b/dom/media/mediasource/MediaSourceDemuxer.cpp
@@ -316,17 +316,17 @@ MediaSourceTrackDemuxer::GetInfo() const
{
return mParent->GetTrackInfo(mType)->Clone();
}
RefPtr<MediaSourceTrackDemuxer::SeekPromise>
MediaSourceTrackDemuxer::Seek(const TimeUnit& aTime)
{
MOZ_ASSERT(mParent, "Called after BreackCycle()");
- return InvokeAsync<TimeUnit&&>(
+ return InvokeAsync(
mParent->GetTaskQueue(), this, __func__,
&MediaSourceTrackDemuxer::DoSeek, aTime);
}
RefPtr<MediaSourceTrackDemuxer::SamplesPromise>
MediaSourceTrackDemuxer::GetSamples(int32_t aNumSamples)
{
MOZ_ASSERT(mParent, "Called after BreackCycle()");
@@ -360,17 +360,17 @@ MediaSourceTrackDemuxer::GetNextRandomAc
*aTime = mNextRandomAccessPoint;
return NS_OK;
}
RefPtr<MediaSourceTrackDemuxer::SkipAccessPointPromise>
MediaSourceTrackDemuxer::SkipToNextRandomAccessPoint(
const TimeUnit& aTimeThreshold)
{
- return InvokeAsync<TimeUnit&&>(
+ return InvokeAsync(
mParent->GetTaskQueue(), this, __func__,
&MediaSourceTrackDemuxer::DoSkipToNextRandomAccessPoint,
aTimeThreshold);
}
media::TimeIntervals
MediaSourceTrackDemuxer::GetBuffered()
{
--- a/xpcom/threads/MozPromise.h
+++ b/xpcom/threads/MozPromise.h
@@ -1323,22 +1323,21 @@ template<typename... Storages,
typename PromiseType, typename ThisType, typename... ArgTypes,
typename... ActualArgTypes,
typename EnableIf<sizeof...(Storages) == 0, int>::Type = 0>
static RefPtr<PromiseType>
InvokeAsync(AbstractThread* aTarget, ThisType* aThisVal, const char* aCallerName,
RefPtr<PromiseType>(ThisType::*aMethod)(ArgTypes...),
ActualArgTypes&&... aArgs)
{
- static_assert((!detail::Any(IsReference<ArgTypes>::value...)) &&
- (!detail::Any(IsPointer<ArgTypes>::value...)),
- "Cannot pass reference/pointer types through InvokeAsync, Storages must be provided");
+ static_assert(!detail::Any(IsPointer<ArgTypes>::value...),
+ "Cannot pass pointer types through InvokeAsync, Storages must be provided");
static_assert(sizeof...(ArgTypes) == sizeof...(ActualArgTypes),
"Method's ArgTypes and ActualArgTypes should have equal sizes");
- return detail::InvokeAsyncImpl<StoreCopyPassByRRef<ArgTypes>...>(
+ return detail::InvokeAsyncImpl<StoreCopyPassByRRef<typename Decay<ArgTypes>::Type>...>(
aTarget, aThisVal, aCallerName, aMethod,
Forward<ActualArgTypes>(aArgs)...);
}
namespace detail {
template<typename Function, typename PromiseType>
class ProxyFunctionRunnable : public CancelableRunnable