| // Copyright (c) 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 THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_THERMAL_RESOURCE_H_ |
| #define THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_THERMAL_RESOURCE_H_ |
| |
| #include "base/feature_list.h" |
| #include "base/memory/scoped_refptr.h" |
| #include "base/single_thread_task_runner.h" |
| #include "base/synchronization/lock.h" |
| #include "base/thread_annotations.h" |
| #include "third_party/blink/public/mojom/peerconnection/peer_connection_tracker.mojom-blink.h" |
| #include "third_party/blink/renderer/modules/modules_export.h" |
| #include "third_party/webrtc/api/adaptation/resource.h" |
| |
| namespace blink { |
| |
| MODULES_EXPORT extern const base::Feature kWebRtcThermalResource; |
| |
| // The ThermalResource reports kOveruse or kUnderuse every 10 seconds(*) while |
| // it has a registered listener and the DeviceThermalMeasurement is known. |
| // Because OnThermalMeasurement() only happens when the thermal state changes, |
| // repeated kOveruse is needed to adapt multiple steps. |
| // |
| // Based on [1] and manual observations, we do not want to adapt if thermals are |
| // kNominal or kFair so we map these to kUnderuse. But if thermals are kSerious |
| // or kCritical this is a strong signal from the OS that "corrective action" or |
| // "immediate corrective action" is needed. |
| // |
| // (*) It can easily take a minute before the thermal state changes after load |
| // distribution has changed, so the effects of ThermalResource is likely to |
| // result in either maximally adapted or not adapted at all. The repeated |
| // interval of 10 seconds was somewhat arbitrarily chosen but was chosen as a |
| // tradeoff between giving the OS time to measure the new load and not making |
| // the resource too spammy. |
| // |
| // [1] |
| // https://developer.apple.com/library/archive/documentation/Performance/Conceptual/power_efficiency_guidelines_osx/RespondToThermalStateChanges.html |
| class MODULES_EXPORT ThermalResource : public webrtc::Resource { |
| public: |
| static scoped_refptr<ThermalResource> Create( |
| scoped_refptr<base::SequencedTaskRunner> task_runner); |
| |
| explicit ThermalResource( |
| scoped_refptr<base::SequencedTaskRunner> task_runner); |
| ~ThermalResource() override = default; |
| |
| void OnThermalMeasurement(mojom::blink::DeviceThermalState measurement); |
| |
| // webrtc::Resource implementation. |
| std::string Name() const override; |
| void SetResourceListener(webrtc::ResourceListener* listener) override; |
| |
| private: |
| void ReportMeasurement(size_t measurement_id); |
| void ReportMeasurementWhileHoldingLock(size_t measurement_id) |
| EXCLUSIVE_LOCKS_REQUIRED(&lock_); |
| |
| const scoped_refptr<base::SequencedTaskRunner> task_runner_; |
| base::Lock lock_; |
| webrtc::ResourceListener* listener_ GUARDED_BY(&lock_) = nullptr; |
| mojom::blink::DeviceThermalState measurement_ GUARDED_BY(&lock_) = |
| mojom::blink::DeviceThermalState::kUnknown; |
| size_t measurement_id_ GUARDED_BY(&lock_) = 0u; |
| }; |
| |
| } // namespace blink |
| |
| #endif // THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_THERMAL_RESOURCE_H_ |