diff -r 000000000000 -r 6474c204b198 gfx/layers/apz/src/TaskThrottler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/layers/apz/src/TaskThrottler.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,63 @@ +/* -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 8; -*- */ +/* vim: set sw=2 sts=2 ts=8 et tw=80 : */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "TaskThrottler.h" + +namespace mozilla { +namespace layers { + +TaskThrottler::TaskThrottler(const TimeStamp& aTimeStamp) + : mOutstanding(false) + , mQueuedTask(nullptr) + , mStartTime(aTimeStamp) + , mMean(1) +{ } + +void +TaskThrottler::PostTask(const tracked_objects::Location& aLocation, + CancelableTask* aTask, const TimeStamp& aTimeStamp) +{ + aTask->SetBirthPlace(aLocation); + + if (mOutstanding) { + if (mQueuedTask) { + mQueuedTask->Cancel(); + } + mQueuedTask = aTask; + } else { + mStartTime = aTimeStamp; + aTask->Run(); + delete aTask; + mOutstanding = true; + } +} + +void +TaskThrottler::TaskComplete(const TimeStamp& aTimeStamp) +{ + if (!mOutstanding) { + return; + } + + mMean.insert(aTimeStamp - mStartTime); + + if (mQueuedTask) { + mStartTime = aTimeStamp; + mQueuedTask->Run(); + mQueuedTask = nullptr; + } else { + mOutstanding = false; + } +} + +TimeDuration +TaskThrottler::TimeSinceLastRequest(const TimeStamp& aTimeStamp) +{ + return aTimeStamp - mStartTime; +} + +} +}