19d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang/*
29d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang * Copyright (C) 2017 The Android Open Source Project
39d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang *
49d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang * Licensed under the Apache License, Version 2.0 (the "License");
59d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang * you may not use this file except in compliance with the License.
69d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang * You may obtain a copy of the License at
79d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang *
89d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang *      http://www.apache.org/licenses/LICENSE-2.0
99d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang *
109d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang * Unless required by applicable law or agreed to in writing, software
119d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang * distributed under the License is distributed on an "AS IS" BASIS,
129d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang * See the License for the specic language governing permissions and
149d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang * limitations under the License.
159d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang */
169d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang
179d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang#ifndef ANDROID_LIBPERFMGR_NODE_H_
189d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang#define ANDROID_LIBPERFMGR_NODE_H_
199d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang
209d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang#include <cstddef>
219d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang#include <string>
229d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang#include <vector>
239d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang
249d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang#include <android-base/unique_fd.h>
259d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang
269d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang#include "perfmgr/RequestGroup.h"
279d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang
289d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wangnamespace android {
299d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wangnamespace perfmgr {
309d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang
319d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang// The Node class provides an interface for adding and cancelling powerhint
329d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang// requests, as well as checking the next time that an in-progress powerhint
339d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang// request will expire. There are additional methods for getting the Node’s name
349d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang// and the index of a value, which may be used for initialization, debugging,
359d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang// and request management. The core of the Node class is a vector of
369d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang// RequestGroups named req_sorted_, which is used to track the in-progress
379d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang// requests on the node. Each entry in the vector corresponds to a possible
389d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang// value for the node, in priority order. For example, the first entry in the
399d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang// vector for the cpu0 cluster represents the in-progress requests to boost the
409d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang// cluster’s frequency to the highest available value. The next entry represents
419d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang// the in-progress requests to boost the cluster’s frequency to the next highest
429d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang// value. For each value, there may be multiple requests because different
439d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang// powerhints may request the same value, and the requests may have different
449d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang// expiration times. All of the in-progress powerhints for a given value are
454ea001c2d3dc3f5c8421a5e86098272b295b213eWei Wang// collected in a RequestGroup. Node class is not thread safe so it needs
464ea001c2d3dc3f5c8421a5e86098272b295b213eWei Wang// protection from caller e.g. NodeLooperThread.
479d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wangclass Node {
489d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang  public:
499d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    Node(std::string name, std::string node_path,
509d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang         std::vector<RequestGroup> req_sorted, std::size_t default_val_index,
519d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang         bool reset_on_init, bool hold_fd = false);
529d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang
539d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    // Return true if successfully add a request
549d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    bool AddRequest(std::size_t value_index, const std::string& hint_type,
559d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang                    ReqTime end_time);
569d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang
579d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    // Return true if successfully remove a request
589d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    bool RemoveRequest(const std::string& hint_type);
599d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang
609d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    // Return the nearest expire time of active requests; return
619d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    // std::chrono::milliseconds::max() if no active request on Node; update
629d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    // node's controlled file node value and the current value index based on
639d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    // active request.
649d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    std::chrono::milliseconds Update();
659d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang
669d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    std::string GetName() const;
679d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    std::string GetPath() const;
689d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    std::vector<std::string> GetValues() const;
699d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    std::size_t GetDefaultIndex() const;
709d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    bool GetResetOnInit() const;
719d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    bool GetHoldFd() const;
729d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    bool GetValueIndex(const std::string value, std::size_t* index) const;
73b243f99965c7f9b780854233273f9d8f9e13b39cWei Wang    void DumpToFd(int fd);
749d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang
759d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang  private:
769d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    Node(const Node& other) = delete;
779d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    Node& operator=(Node const&) = delete;
789d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang
799d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    const std::string name_;
809d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    const std::string node_path_;
819d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    // request vector, one entry per possible value, sorted by priority
829d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    std::vector<RequestGroup> req_sorted_;
839d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    const std::size_t default_val_index_;
849d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    std::size_t current_val_index_;
859d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    const bool reset_on_init_;
869d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    const bool hold_fd_;
879d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang    android::base::unique_fd fd_;
889d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang};
899d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang
909d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang}  // namespace perfmgr
919d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang}  // namespace android
929d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang
939d337a7df3ba6d6a8418f58ed59611678ae7b8cdWei Wang#endif  // ANDROID_LIBPERFMGR_NODE_H_
94