gecko-dev/xpcom/threads/IdleTaskRunner.h
Nathan Froyd d81ba0426a Bug 1499725 - make IdleTaskRunner timers more efficient; r=farre
Instead of creating a timer and then setting the timer's target, we can
determine the timer's target and pass it in directly when the timer is
created.  This reordering of steps is slightly more efficient, since
SetTarget() is both a virtual call and requires locking, both of which
can be skipped if we know the target at timer creation time.  If we're
reusing the timer, we also don't need to repeatedly set the timer's
target: we can set the target once at timer creation, and then be done.

We can do this safely here because mTaskCategory doesn't change
throughout the life of the IdleTaskRunner; we make mTaskCategory `const`
to make this more explicit to the reader.
2018-10-22 09:44:50 -04:00

76 lines
2.5 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 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/. */
#ifndef IdleTaskRunner_h
#define IdleTaskRunner_h
#include "mozilla/TimeStamp.h"
#include "mozilla/TaskCategory.h"
#include "nsThreadUtils.h"
#include <functional>
namespace mozilla {
// A general purpose repeating callback runner (it can be configured
// to a one-time runner, too.) If it is running repeatedly,
// one has to either explicitly Cancel() the runner or have
// MayContinueProcessing() callback return false to completely remove
// the runner.
class IdleTaskRunner final : public IdleRunnable
{
public:
// Return true if some meaningful work was done.
using CallbackType = std::function<bool(TimeStamp aDeadline)>;
// A callback for "stop processing" decision. Return true to
// stop processing. This can be an alternative to Cancel() or
// work together in different way.
using MayStopProcessingCallbackType = std::function<bool()>;
public:
static already_AddRefed<IdleTaskRunner>
Create(const CallbackType& aCallback,
const char* aRunnableName, uint32_t aDelay,
int64_t aBudget, bool aRepeating,
const MayStopProcessingCallbackType& aMayStopProcessing,
TaskCategory aTaskCategory = TaskCategory::Count);
NS_IMETHOD Run() override;
void SetDeadline(mozilla::TimeStamp aDeadline) override;
void SetTimer(uint32_t aDelay, nsIEventTarget* aTarget) override;
nsresult Cancel() override;
void Schedule(bool aAllowIdleDispatch);
private:
explicit IdleTaskRunner(const CallbackType& aCallback,
const char* aRunnableName,
uint32_t aDelay, int64_t aBudget,
bool aRepeating,
const MayStopProcessingCallbackType& aMayStopProcessing,
TaskCategory aTaskCategory);
~IdleTaskRunner();
void CancelTimer();
void SetTimerInternal(uint32_t aDelay);
nsCOMPtr<nsITimer> mTimer;
nsCOMPtr<nsITimer> mScheduleTimer;
CallbackType mCallback;
uint32_t mDelay;
TimeStamp mDeadline;
TimeDuration mBudget;
bool mRepeating;
bool mTimerActive;
MayStopProcessingCallbackType mMayStopProcessing;
const TaskCategory mTaskCategory;
const char* mName;
};
} // end of namespace mozilla.
#endif