michael@0: /* -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 8; -*- */ michael@0: /* vim: set sw=2 sts=2 ts=8 et tw=80 : */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "TaskThrottler.h" michael@0: michael@0: namespace mozilla { michael@0: namespace layers { michael@0: michael@0: TaskThrottler::TaskThrottler(const TimeStamp& aTimeStamp) michael@0: : mOutstanding(false) michael@0: , mQueuedTask(nullptr) michael@0: , mStartTime(aTimeStamp) michael@0: , mMean(1) michael@0: { } michael@0: michael@0: void michael@0: TaskThrottler::PostTask(const tracked_objects::Location& aLocation, michael@0: CancelableTask* aTask, const TimeStamp& aTimeStamp) michael@0: { michael@0: aTask->SetBirthPlace(aLocation); michael@0: michael@0: if (mOutstanding) { michael@0: if (mQueuedTask) { michael@0: mQueuedTask->Cancel(); michael@0: } michael@0: mQueuedTask = aTask; michael@0: } else { michael@0: mStartTime = aTimeStamp; michael@0: aTask->Run(); michael@0: delete aTask; michael@0: mOutstanding = true; michael@0: } michael@0: } michael@0: michael@0: void michael@0: TaskThrottler::TaskComplete(const TimeStamp& aTimeStamp) michael@0: { michael@0: if (!mOutstanding) { michael@0: return; michael@0: } michael@0: michael@0: mMean.insert(aTimeStamp - mStartTime); michael@0: michael@0: if (mQueuedTask) { michael@0: mStartTime = aTimeStamp; michael@0: mQueuedTask->Run(); michael@0: mQueuedTask = nullptr; michael@0: } else { michael@0: mOutstanding = false; michael@0: } michael@0: } michael@0: michael@0: TimeDuration michael@0: TaskThrottler::TimeSinceLastRequest(const TimeStamp& aTimeStamp) michael@0: { michael@0: return aTimeStamp - mStartTime; michael@0: } michael@0: michael@0: } michael@0: }