123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- // Copyright 2020 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #ifndef COMPONENTS_PERFORMANCE_MANAGER_V8_MEMORY_V8_DETAILED_MEMORY_DECORATOR_H_
- #define COMPONENTS_PERFORMANCE_MANAGER_V8_MEMORY_V8_DETAILED_MEMORY_DECORATOR_H_
- #include <memory>
- #include "base/callback_forward.h"
- #include "base/memory/raw_ptr.h"
- #include "base/sequence_checker.h"
- #include "base/types/pass_key.h"
- #include "components/performance_manager/public/graph/graph.h"
- #include "components/performance_manager/public/graph/graph_registered.h"
- #include "components/performance_manager/public/graph/node_data_describer.h"
- #include "components/performance_manager/public/graph/process_node.h"
- #include "components/performance_manager/public/v8_memory/v8_detailed_memory.h"
- #include "mojo/public/cpp/bindings/pending_receiver.h"
- #include "third_party/blink/public/mojom/performance_manager/v8_detailed_memory_reporter.mojom.h"
- namespace performance_manager {
- class FrameNode;
- namespace v8_memory {
- class V8DetailedMemoryRequestQueue;
- // A decorator that queries each renderer process for the amount of memory used
- // by V8 in each frame. The public interface to create requests for this
- // decorator is in
- // //components/performance_manager/public/v8_detailed_memory.h.
- class V8DetailedMemoryDecorator
- : public GraphOwned,
- public GraphRegisteredImpl<V8DetailedMemoryDecorator>,
- public ProcessNode::ObserverDefaultImpl,
- public NodeDataDescriberDefaultImpl {
- public:
- V8DetailedMemoryDecorator();
- ~V8DetailedMemoryDecorator() override;
- V8DetailedMemoryDecorator(const V8DetailedMemoryDecorator&) = delete;
- V8DetailedMemoryDecorator& operator=(const V8DetailedMemoryDecorator&) =
- delete;
- // GraphOwned implementation.
- void OnPassedToGraph(Graph* graph) override;
- void OnTakenFromGraph(Graph* graph) override;
- // ProcessNodeObserver overrides.
- void OnProcessNodeAdded(const ProcessNode* process_node) override;
- void OnBeforeProcessNodeRemoved(const ProcessNode* process_node) override;
- // NodeDataDescriber overrides.
- base::Value DescribeFrameNodeData(const FrameNode* node) const override;
- base::Value DescribeProcessNodeData(const ProcessNode* node) const override;
- // Returns the next measurement request that should be scheduled.
- const V8DetailedMemoryRequest* GetNextRequest() const;
- // Returns the next measurement request with mode kBounded or
- // kEagerForTesting that should be scheduled.
- const V8DetailedMemoryRequest* GetNextBoundedRequest() const;
- // Implementation details below this point.
- // V8DetailedMemoryRequest objects register themselves with the decorator.
- // If |process_node| is null, the request will be sent to every renderer
- // process, otherwise it will be sent only to |process_node|.
- void AddMeasurementRequest(base::PassKey<V8DetailedMemoryRequest>,
- V8DetailedMemoryRequest* request,
- const ProcessNode* process_node = nullptr);
- void RemoveMeasurementRequest(base::PassKey<V8DetailedMemoryRequest>,
- V8DetailedMemoryRequest* request);
- // Internal helper class that can call NotifyObserversOnMeasurementAvailable
- // when a measurement is received.
- class ObserverNotifier;
- void NotifyObserversOnMeasurementAvailable(
- base::PassKey<ObserverNotifier>,
- const ProcessNode* process_node) const;
- // The following functions retrieve data maintained by the decorator.
- static const V8DetailedMemoryExecutionContextData* GetExecutionContextData(
- const FrameNode* node);
- static const V8DetailedMemoryExecutionContextData* GetExecutionContextData(
- const WorkerNode* node);
- static const V8DetailedMemoryExecutionContextData* GetExecutionContextData(
- const execution_context::ExecutionContext* ec);
- static V8DetailedMemoryExecutionContextData*
- CreateExecutionContextDataForTesting(const FrameNode* node);
- static V8DetailedMemoryExecutionContextData*
- CreateExecutionContextDataForTesting(const WorkerNode* node);
- static const V8DetailedMemoryProcessData* GetProcessData(
- const ProcessNode* node);
- static V8DetailedMemoryProcessData* CreateProcessDataForTesting(
- const ProcessNode* node);
- private:
- using RequestQueueCallback =
- base::RepeatingCallback<void(V8DetailedMemoryRequestQueue*)>;
- // Runs the given |callback| for every V8DetailedMemoryRequestQueue (global
- // and per-process).
- void ApplyToAllRequestQueues(RequestQueueCallback callback) const;
- void UpdateProcessMeasurementSchedules() const;
- raw_ptr<Graph> graph_ GUARDED_BY_CONTEXT(sequence_checker_) = nullptr;
- std::unique_ptr<V8DetailedMemoryRequestQueue> measurement_requests_
- GUARDED_BY_CONTEXT(sequence_checker_);
- SEQUENCE_CHECKER(sequence_checker_);
- };
- //////////////////////////////////////////////////////////////////////////////
- // The following internal functions are exposed in the header for testing.
- namespace internal {
- // A callback that will bind a V8DetailedMemoryReporter interface to
- // communicate with the given process. Exposed so that it can be overridden to
- // implement the interface with a test fake.
- using BindV8DetailedMemoryReporterCallback = base::RepeatingCallback<void(
- mojo::PendingReceiver<blink::mojom::V8DetailedMemoryReporter>,
- RenderProcessHostProxy)>;
- // Sets a callback that will be used to bind the V8DetailedMemoryReporter
- // interface. The callback is owned by the caller and must live until this
- // function is called again with nullptr.
- void SetBindV8DetailedMemoryReporterCallbackForTesting(
- BindV8DetailedMemoryReporterCallback* callback);
- // Destroys the V8DetailedMemoryDecorator. Exposed for testing.
- void DestroyV8DetailedMemoryDecoratorForTesting(Graph* graph);
- } // namespace internal
- } // namespace v8_memory
- } // namespace performance_manager
- #endif // COMPONENTS_PERFORMANCE_MANAGER_V8_MEMORY_V8_DETAILED_MEMORY_DECORATOR_H_
|