Bug 1464090 - InputStreamLengthHelper must swap the callback in order to release them on the owning thread, r=mayhemer

This commit is contained in:
Andrea Marchesini 2018-05-31 18:12:25 +02:00
parent c2a7f75146
commit f6ec0a57a4
2 changed files with 23 additions and 9 deletions

View File

@ -50,7 +50,9 @@ public:
}
// pong
mCallback(mSize);
std::function<void(int64_t aLength)> callback;
callback.swap(mCallback);
callback(mSize);
return NS_OK;
}
@ -187,7 +189,7 @@ InputStreamLengthHelper::Run()
// All good!
if (NS_SUCCEEDED(rv)) {
mCallback(length);
ExecCallback(length);
return NS_OK;
}
@ -195,7 +197,7 @@ InputStreamLengthHelper::Run()
if (rv == NS_BASE_STREAM_CLOSED ||
NS_WARN_IF(rv == NS_ERROR_NOT_AVAILABLE) ||
NS_WARN_IF(rv != NS_BASE_STREAM_WOULD_BLOCK)) {
mCallback(-1);
ExecCallback(-1);
return NS_OK;
}
}
@ -208,7 +210,7 @@ InputStreamLengthHelper::Run()
asyncStreamLength->AsyncLengthWait(this,
GetCurrentThreadSerialEventTarget());
if (NS_WARN_IF(NS_FAILED(rv))) {
mCallback(-1);
ExecCallback(-1);
}
return NS_OK;
@ -218,11 +220,11 @@ InputStreamLengthHelper::Run()
uint64_t available = 0;
nsresult rv = mStream->Available(&available);
if (NS_WARN_IF(NS_FAILED(rv))) {
mCallback(-1);
ExecCallback(-1);
return NS_OK;
}
mCallback((int64_t)available);
ExecCallback((int64_t)available);
return NS_OK;
}
@ -230,12 +232,21 @@ NS_IMETHODIMP
InputStreamLengthHelper::OnInputStreamLengthReady(nsIAsyncInputStreamLength* aStream,
int64_t aLength)
{
MOZ_ASSERT(mCallback);
mCallback(aLength);
mCallback = nullptr;
ExecCallback(aLength);
return NS_OK;
}
void
InputStreamLengthHelper::ExecCallback(int64_t aLength)
{
MOZ_ASSERT(mCallback);
std::function<void(int64_t aLength)> callback;
callback.swap(mCallback);
callback(aLength);
}
NS_IMPL_ISUPPORTS_INHERITED(InputStreamLengthHelper, Runnable,
nsIInputStreamLengthCallback)

View File

@ -42,6 +42,9 @@ private:
NS_IMETHOD
Run() override;
void
ExecCallback(int64_t aLength);
nsCOMPtr<nsIInputStream> mStream;
std::function<void(int64_t aLength)> mCallback;
};