1 #ifndef ANDROID_DVR_PERFORMANCED_TASK_H_ 2 #define ANDROID_DVR_PERFORMANCED_TASK_H_ 3 4 #include <sys/types.h> 5 6 #include <array> 7 #include <cstdio> 8 #include <memory> 9 #include <string> 10 #include <unordered_map> 11 #include <vector> 12 13 #include <android-base/unique_fd.h> 14 15 #include "unique_file.h" 16 17 namespace android { 18 namespace dvr { 19 20 // Task provides access to task-related information from the procfs 21 // pseudo-filesystem. 22 class Task { 23 public: 24 explicit Task(pid_t task_id); 25 26 bool IsValid() const { return task_fd_.get() >= 0; } 27 explicit operator bool() const { return IsValid(); } 28 29 pid_t task_id() const { return task_id_; } 30 std::string name() const { return name_; } 31 pid_t thread_group_id() const { return thread_group_id_; } 32 pid_t parent_process_id() const { return parent_process_id_; } 33 size_t thread_count() const { return thread_count_; } 34 uint32_t cpus_allowed_mask() const { return cpus_allowed_mask_; } 35 const std::string& cpus_allowed_list() const { return cpus_allowed_list_; } 36 const std::array<int, 4>& user_id() const { return user_id_; } 37 const std::array<int, 4>& group_id() const { return group_id_; } 38 39 // Indices into user and group id arrays. 40 enum { 41 kUidReal = 0, 42 kUidEffective, 43 kUidSavedSet, 44 kUidFilesystem, 45 }; 46 47 std::string GetCpuSetPath() const; 48 49 private: 50 pid_t task_id_; 51 base::unique_fd task_fd_; 52 53 // Fields read from /proc/<task_id_>/status. 54 std::string name_; 55 pid_t thread_group_id_; 56 pid_t parent_process_id_; 57 std::array<int, 4> user_id_; 58 std::array<int, 4> group_id_; 59 size_t thread_count_; 60 uint32_t cpus_allowed_mask_; 61 std::string cpus_allowed_list_; 62 63 // Opens the file /proc/<task_id_>/|name| and returns the open file 64 // descriptor. 65 base::unique_fd OpenTaskFile(const std::string& name) const; 66 67 // Similar to OpenTaskFile() but returns a file pointer. 68 UniqueFile OpenTaskFilePointer(const std::string& name) const; 69 70 // Reads the field named |field| from /proc/<task_id_>/status. 71 std::string GetStatusField(const std::string& field) const; 72 73 // Reads a subset of the fields in /proc/<task_id_>/status. 74 void ReadStatusFields(); 75 76 Task(const Task&) = delete; 77 void operator=(const Task&) = delete; 78 }; 79 80 } // namespace dvr 81 } // namespace android 82 83 #endif // ANDROID_DVR_PERFORMANCED_TASK_H_ 84