mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-23 18:26:15 +00:00
Bug 1161443: Always read SDM::mWaitForInternalDrain while holding monitor. r=gerald
This commit is contained in:
parent
dbf43400f9
commit
aacb467ca4
@ -150,9 +150,16 @@ void
|
|||||||
SharedDecoderManager::SetIdle(MediaDataDecoder* aProxy)
|
SharedDecoderManager::SetIdle(MediaDataDecoder* aProxy)
|
||||||
{
|
{
|
||||||
if (aProxy && mActiveProxy == aProxy) {
|
if (aProxy && mActiveProxy == aProxy) {
|
||||||
|
MonitorAutoLock mon(mMonitor);
|
||||||
mWaitForInternalDrain = true;
|
mWaitForInternalDrain = true;
|
||||||
if (NS_SUCCEEDED(mActiveProxy->Drain())) {
|
nsresult rv;
|
||||||
MonitorAutoLock mon(mMonitor);
|
{
|
||||||
|
// We don't want to hold the lock while calling Drain() has some
|
||||||
|
// platform implementations call DrainComplete() immediately.
|
||||||
|
MonitorAutoUnlock mon(mMonitor);
|
||||||
|
rv = mActiveProxy->Drain();
|
||||||
|
}
|
||||||
|
if (NS_SUCCEEDED(rv)) {
|
||||||
while (mWaitForInternalDrain) {
|
while (mWaitForInternalDrain) {
|
||||||
mon.Wait();
|
mon.Wait();
|
||||||
}
|
}
|
||||||
@ -165,13 +172,15 @@ SharedDecoderManager::SetIdle(MediaDataDecoder* aProxy)
|
|||||||
void
|
void
|
||||||
SharedDecoderManager::DrainComplete()
|
SharedDecoderManager::DrainComplete()
|
||||||
{
|
{
|
||||||
if (mWaitForInternalDrain) {
|
{
|
||||||
MonitorAutoLock mon(mMonitor);
|
MonitorAutoLock mon(mMonitor);
|
||||||
mWaitForInternalDrain = false;
|
if (mWaitForInternalDrain) {
|
||||||
mon.NotifyAll();
|
mWaitForInternalDrain = false;
|
||||||
} else {
|
mon.NotifyAll();
|
||||||
mActiveCallback->DrainComplete();
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
mActiveCallback->DrainComplete();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
Reference in New Issue
Block a user