Bug 1095242. Part 5: Unobserve vsync in RefreshTimerVsyncDispatcher. r=kats

This commit is contained in:
Mason Chang 2015-01-20 08:31:26 -08:00
Родитель ebe0a9bec5
Коммит 94e7103a97
2 изменённых файлов: 45 добавлений и 8 удалений

Просмотреть файл

@ -123,26 +123,61 @@ RefreshTimerVsyncDispatcher::NotifyVsync(TimeStamp aVsyncTimestamp)
void void
RefreshTimerVsyncDispatcher::SetParentRefreshTimer(VsyncObserver* aVsyncObserver) RefreshTimerVsyncDispatcher::SetParentRefreshTimer(VsyncObserver* aVsyncObserver)
{ {
MutexAutoLock lock(mRefreshTimersLock); MOZ_ASSERT(NS_IsMainThread());
mParentRefreshTimer = aVsyncObserver; { // lock scope because UpdateVsyncStatus runs on main thread and will deadlock
MutexAutoLock lock(mRefreshTimersLock);
mParentRefreshTimer = aVsyncObserver;
}
UpdateVsyncStatus();
} }
void void
RefreshTimerVsyncDispatcher::AddChildRefreshTimer(VsyncObserver* aVsyncObserver) RefreshTimerVsyncDispatcher::AddChildRefreshTimer(VsyncObserver* aVsyncObserver)
{ {
MutexAutoLock lock(mRefreshTimersLock); { // scope lock - called on pbackground thread
MOZ_ASSERT(aVsyncObserver); MutexAutoLock lock(mRefreshTimersLock);
if (!mChildRefreshTimers.Contains(aVsyncObserver)) { MOZ_ASSERT(aVsyncObserver);
mChildRefreshTimers.AppendElement(aVsyncObserver); if (!mChildRefreshTimers.Contains(aVsyncObserver)) {
mChildRefreshTimers.AppendElement(aVsyncObserver);
}
} }
UpdateVsyncStatus();
} }
void void
RefreshTimerVsyncDispatcher::RemoveChildRefreshTimer(VsyncObserver* aVsyncObserver) RefreshTimerVsyncDispatcher::RemoveChildRefreshTimer(VsyncObserver* aVsyncObserver)
{ {
{ // scope lock - called on pbackground thread
MutexAutoLock lock(mRefreshTimersLock);
MOZ_ASSERT(aVsyncObserver);
mChildRefreshTimers.RemoveElement(aVsyncObserver);
}
UpdateVsyncStatus();
}
void
RefreshTimerVsyncDispatcher::UpdateVsyncStatus()
{
if (!NS_IsMainThread()) {
nsCOMPtr<nsIRunnable> vsyncControl = NS_NewRunnableMethod(this,
&RefreshTimerVsyncDispatcher::UpdateVsyncStatus);
NS_DispatchToMainThread(vsyncControl);
return;
}
gfx::VsyncSource::Display& display = gfxPlatform::GetPlatform()->GetHardwareVsync()->GetGlobalDisplay();
display.NotifyRefreshTimerVsyncStatus(NeedsVsync());
}
bool
RefreshTimerVsyncDispatcher::NeedsVsync()
{
MOZ_ASSERT(NS_IsMainThread());
MutexAutoLock lock(mRefreshTimersLock); MutexAutoLock lock(mRefreshTimersLock);
MOZ_ASSERT(aVsyncObserver); return (mParentRefreshTimer != nullptr) || !mChildRefreshTimers.IsEmpty();
mChildRefreshTimers.RemoveElement(aVsyncObserver);
} }
} // namespace mozilla } // namespace mozilla

Просмотреть файл

@ -79,6 +79,8 @@ public:
private: private:
virtual ~RefreshTimerVsyncDispatcher(); virtual ~RefreshTimerVsyncDispatcher();
void UpdateVsyncStatus();
bool NeedsVsync();
Mutex mRefreshTimersLock; Mutex mRefreshTimersLock;
nsRefPtr<VsyncObserver> mParentRefreshTimer; nsRefPtr<VsyncObserver> mParentRefreshTimer;