Commit 9e96adc9 authored by Peiyong Lin's avatar Peiyong Lin Committed by Commit Bot

[ResourceCoordinator] Introduce mojo interface per coordination unit type.

This patch introduces mojo interface for each existing coordination unit,
defines and implements the APIs for sending signals to coordination unit.

This patch is part of the progress to make sure coordination unit in
resource_coordinator/ strongly typed.
See https://chromium-review.googlesource.com/c/chromium/src/+/719516
for a fully working prototype.

BUG=775691

Change-Id: I2677920f07dafe3334a09a945e0d4e19266de319
Reviewed-on: https://chromium-review.googlesource.com/724186
Commit-Queue: lpy <lpy@chromium.org>
Reviewed-by: default avatarZhen Wang <zhenw@chromium.org>
Reviewed-by: default avataroysteine <oysteine@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Cr-Commit-Position: refs/heads/master@{#509997}
parent 0a7aa5ae
......@@ -60,6 +60,22 @@ FrameCoordinationUnitImpl::GetAssociatedCoordinationUnitsOfType(
}
}
void FrameCoordinationUnitImpl::SetAudibility(bool audible) {
SetProperty(mojom::PropertyType::kAudible, audible);
}
void FrameCoordinationUnitImpl::SetNetworkAlmostIdleness(bool idle) {
SetProperty(mojom::PropertyType::kNetworkAlmostIdle, idle);
}
void FrameCoordinationUnitImpl::OnAlertFired() {
SendEvent(mojom::Event::kAlertFired);
}
void FrameCoordinationUnitImpl::OnNonPersistentNotificationCreated() {
SendEvent(mojom::Event::kNonPersistentNotificationCreated);
}
PageCoordinationUnitImpl* FrameCoordinationUnitImpl::GetPageCoordinationUnit()
const {
for (auto* parent : parents_) {
......
......@@ -15,7 +15,8 @@ namespace resource_coordinator {
// Frame Coordination Units form a tree structure, each FrameCoordinationUnit at
// most has one parent that is a FrameCoordinationUnit.
// A Frame Coordination Unit will have parents only if navigation committed.
class FrameCoordinationUnitImpl : public CoordinationUnitBase {
class FrameCoordinationUnitImpl : public CoordinationUnitBase,
public mojom::FrameCoordinationUnit {
public:
FrameCoordinationUnitImpl(
const CoordinationUnitID& id,
......@@ -26,8 +27,13 @@ class FrameCoordinationUnitImpl : public CoordinationUnitBase {
std::set<CoordinationUnitBase*> GetAssociatedCoordinationUnitsOfType(
CoordinationUnitType type) const override;
PageCoordinationUnitImpl* GetPageCoordinationUnit() const;
// FrameCoordinationUnit implementation.
void SetAudibility(bool audible) override;
void SetNetworkAlmostIdleness(bool idle) override;
void OnAlertFired() override;
void OnNonPersistentNotificationCreated() override;
PageCoordinationUnitImpl* GetPageCoordinationUnit() const;
bool IsMainFrame() const;
private:
......@@ -35,6 +41,7 @@ class FrameCoordinationUnitImpl : public CoordinationUnitBase {
void OnEventReceived(const mojom::Event event) override;
void OnPropertyChanged(const mojom::PropertyType property_type,
int64_t value) override;
DISALLOW_COPY_AND_ASSIGN(FrameCoordinationUnitImpl);
};
......
......@@ -19,6 +19,26 @@ PageCoordinationUnitImpl::PageCoordinationUnitImpl(
PageCoordinationUnitImpl::~PageCoordinationUnitImpl() = default;
void PageCoordinationUnitImpl::SetVisibility(bool visible) {
SetProperty(mojom::PropertyType::kVisible, visible);
}
void PageCoordinationUnitImpl::SetUKMSourceId(int64_t ukm_source_id) {
SetProperty(mojom::PropertyType::kUKMSourceId, ukm_source_id);
}
void PageCoordinationUnitImpl::OnFaviconUpdated() {
SendEvent(mojom::Event::kFaviconUpdated);
}
void PageCoordinationUnitImpl::OnTitleUpdated() {
SendEvent(mojom::Event::kTitleUpdated);
}
void PageCoordinationUnitImpl::OnMainFrameNavigationCommitted() {
SendEvent(mojom::Event::kNavigationCommitted);
}
std::set<CoordinationUnitBase*>
PageCoordinationUnitImpl::GetAssociatedCoordinationUnitsOfType(
CoordinationUnitType type) const {
......
......@@ -14,13 +14,21 @@
namespace resource_coordinator {
class PageCoordinationUnitImpl : public CoordinationUnitBase {
class PageCoordinationUnitImpl : public CoordinationUnitBase,
public mojom::PageCoordinationUnit {
public:
PageCoordinationUnitImpl(
const CoordinationUnitID& id,
std::unique_ptr<service_manager::ServiceContextRef> service_ref);
~PageCoordinationUnitImpl() override;
// mojom::PageCoordinationUnit implementation.
void SetVisibility(bool visible) override;
void SetUKMSourceId(int64_t ukm_source_id) override;
void OnFaviconUpdated() override;
void OnTitleUpdated() override;
void OnMainFrameNavigationCommitted() override;
// CoordinationUnitBase implementation.
std::set<CoordinationUnitBase*> GetAssociatedCoordinationUnitsOfType(
CoordinationUnitType type) const override;
......
......@@ -18,6 +18,24 @@ ProcessCoordinationUnitImpl::ProcessCoordinationUnitImpl(
ProcessCoordinationUnitImpl::~ProcessCoordinationUnitImpl() = default;
void ProcessCoordinationUnitImpl::SetCPUUsage(double cpu_usage) {
SetProperty(mojom::PropertyType::kCPUUsage, cpu_usage * 1000);
}
void ProcessCoordinationUnitImpl::SetExpectedTaskQueueingDuration(
base::TimeDelta duration) {
SetProperty(mojom::PropertyType::kExpectedTaskQueueingDuration,
duration.InMilliseconds());
}
void ProcessCoordinationUnitImpl::SetLaunchTime(base::Time launch_time) {
SetProperty(mojom::PropertyType::kLaunchTime, launch_time.ToTimeT());
}
void ProcessCoordinationUnitImpl::SetPID(int64_t pid) {
SetProperty(mojom::PropertyType::kPID, pid);
}
std::set<CoordinationUnitBase*>
ProcessCoordinationUnitImpl::GetAssociatedCoordinationUnitsOfType(
CoordinationUnitType type) const {
......
......@@ -12,7 +12,8 @@
namespace resource_coordinator {
class ProcessCoordinationUnitImpl : public CoordinationUnitBase {
class ProcessCoordinationUnitImpl : public CoordinationUnitBase,
public mojom::ProcessCoordinationUnit {
public:
ProcessCoordinationUnitImpl(
const CoordinationUnitID& id,
......@@ -20,6 +21,12 @@ class ProcessCoordinationUnitImpl : public CoordinationUnitBase {
~ProcessCoordinationUnitImpl() override;
// CoordinationUnitBase implementation.
// mojom::ProcessCoordinationUnit implementation.
void SetCPUUsage(double cpu_usage) override;
void SetExpectedTaskQueueingDuration(base::TimeDelta duration) override;
void SetLaunchTime(base::Time launch_time) override;
void SetPID(int64_t pid) override;
std::set<CoordinationUnitBase*> GetAssociatedCoordinationUnitsOfType(
CoordinationUnitType type) const override;
......
......@@ -4,8 +4,8 @@
module resource_coordinator.mojom;
import "mojo/common/time.mojom";
import "signals.mojom";
import "mojo/common/values.mojom";
// Any new type here needs to be mirrored between coordination_unit_types.h and
// coordination_unit.mojom, and have mappings between the two defined in
......@@ -21,6 +21,7 @@ struct CoordinationUnitID {
int64 id;
};
// TODO(lpy) Remove this interface once the per-type interface is fully in use.
interface CoordinationUnit {
// Mainly used to force a round-trip to the service over the pipe for
// a specific unit, so we don't have to deal with possibly-not-yet-created
......@@ -44,3 +45,35 @@ interface CoordinationUnit {
// Sets a property on the CoordinationUnit's internal key-value store.
SetProperty(PropertyType property_type, int64 value);
};
// A FrameCoordinationUnit has at most one ProcessCoordinationUnit as its
// parent, at most one PageCoordinationUnit as its parent, at most one
// FrameCoordinationUnit as parent frame, and can have many child frames.
interface FrameCoordinationUnit {
// Property signals.
SetAudibility(bool audible);
SetNetworkAlmostIdleness(bool idle);
// Event signals.
OnAlertFired();
OnNonPersistentNotificationCreated();
};
interface PageCoordinationUnit {
// Property signals.
SetVisibility(bool visible);
SetUKMSourceId(int64 ukm_source_id);
// Event signals.
OnFaviconUpdated();
OnTitleUpdated();
OnMainFrameNavigationCommitted();
};
interface ProcessCoordinationUnit {
// Property signals.
SetCPUUsage(double cpu_usage);
SetExpectedTaskQueueingDuration(mojo.common.mojom.TimeDelta duration);
SetLaunchTime(mojo.common.mojom.Time launch_time);
SetPID(int64 pid);
};
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment