зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1095242. Part 5: Unobserve vsync in RefreshTimerVsyncDispatcher. r=kats
This commit is contained in:
Родитель
ebe0a9bec5
Коммит
94e7103a97
|
@ -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;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче