Files
tubestation/xpcom/base/MemoryTelemetry.h
Paul Bone a61acdde21 Bug 1917184 - Detect "idleness" more accurately r=mccr8
This patch adds a sliding window of recent calls to Poke() that is used to
determine if the process is idle.  This avoids running the memory telemetry
when the process should be idle.

Differential Revision: https://phabricator.services.mozilla.com/D232588
2025-01-07 06:56:32 +00:00

86 lines
2.0 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 mozilla_MemoryTelemetry_h
#define mozilla_MemoryTelemetry_h
#include "mozilla/TimeStamp.h"
#include "mozilla/Maybe.h"
#include "mozilla/Result.h"
#include "nsIObserver.h"
#include "nsITimer.h"
#include "nsTArray.h"
#include "nsWeakReference.h"
#include <functional>
class nsIEventTarget;
class TimeStampWindow;
namespace mozilla {
namespace ipc {
enum class ResponseRejectReason;
}
/**
* Periodically gathers memory usage metrics after cycle collection, and
* populates telemetry histograms with their values.
*/
class MemoryTelemetry final : public nsIObserver,
public nsSupportsWeakReference {
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIOBSERVER
static MemoryTelemetry& Get();
nsresult GatherReports(
const std::function<void()>& aCompletionCallback = nullptr);
/**
* Called to signal that we can begin collecting telemetry.
*/
void DelayedInit();
/**
* Notify that the browser is active and telemetry should be recorded soon.
*/
void Poke();
nsresult Shutdown();
private:
MemoryTelemetry();
~MemoryTelemetry() = default;
void Init();
static Result<uint32_t, nsresult> GetOpenTabsCount();
void GatherTotalMemory();
nsresult FinishGatheringTotalMemory(Maybe<int64_t> aTotalMemory,
const nsTArray<int64_t>& aChildSizes);
nsCOMPtr<nsIEventTarget> mThreadPool;
bool mGatheringTotalMemory = false;
TimeStamp mLastRun{};
TimeStamp mLastPoke{};
UniquePtr<TimeStampWindow> mPokeWindow;
nsCOMPtr<nsITimer> mTimer;
// True if startup is finished and it's okay to start gathering telemetry.
bool mCanRun = false;
};
} // namespace mozilla
#endif // defined mozilla_MemoryTelemetry_h