Some nodes have dependency in each other: e.g cpufreq min/max
Bug:
116855734
Test: libperfmgr_test pass
Change-Id: Ica639b94e78d40fd0f21fb8f241dc1887a6756fc
return ret;
}
-std::chrono::milliseconds Node::Update() {
+std::chrono::milliseconds Node::Update(bool log_error) {
std::size_t value_index = default_val_index_;
std::chrono::milliseconds expire_time = std::chrono::milliseconds::max();
open(node_path_.c_str(), O_WRONLY | O_CLOEXEC | O_TRUNC)));
if (fd_ == -1 || !android::base::WriteStringToFd(req_value, fd_)) {
- LOG(ERROR) << "Failed to write to node: " << node_path_
- << " with value: " << req_value << ", fd: " << fd_;
+ if (log_error) {
+ LOG(WARNING) << "Failed to write to node: " << node_path_
+ << " with value: " << req_value << ", fd: " << fd_;
+ }
// Retry in 500ms or sooner
expire_time = std::min(expire_time, std::chrono::milliseconds(500));
} else {
bool NodeLooperThread::threadLoop() {
::android::AutoMutex _l(lock_);
std::chrono::milliseconds timeout_ms = kMaxUpdatePeriod;
+
+ // Update 2 passes: some node may have dependency in other node
+ // e.g. update cpufreq min to VAL while cpufreq max still set to
+ // a value lower than VAL, is expected to fail in first pass
+ for (auto& n : nodes_) {
+ n->Update(false);
+ }
for (auto& n : nodes_) {
- auto t = n->Update();
- timeout_ms = std::min(t, timeout_ms);
+ timeout_ms = std::min(n->Update(), timeout_ms);
}
nsecs_t sleep_timeout_ns = std::numeric_limits<nsecs_t>::max();
// std::chrono::milliseconds::max() if no active request on Node; update
// node's controlled file node value and the current value index based on
// active request.
- std::chrono::milliseconds Update();
+ std::chrono::milliseconds Update(bool log_error = true);
std::string GetName() const;
std::string GetPath() const;