ProcessModel.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/HashMap.h>
  8. #include <AK/NonnullOwnPtrVector.h>
  9. #include <AK/String.h>
  10. #include <AK/Vector.h>
  11. #include <LibGUI/Model.h>
  12. #include <unistd.h>
  13. class GraphWidget;
  14. class ProcessModel final : public GUI::Model {
  15. public:
  16. enum Column {
  17. Icon = 0,
  18. PID,
  19. Name,
  20. CPU,
  21. State,
  22. User,
  23. Virtual,
  24. DirtyPrivate,
  25. Pledge,
  26. Physical,
  27. CleanInode,
  28. PurgeableVolatile,
  29. PurgeableNonvolatile,
  30. Veil,
  31. Processor,
  32. Priority,
  33. TID,
  34. PPID,
  35. PGID,
  36. SID,
  37. Syscalls,
  38. InodeFaults,
  39. ZeroFaults,
  40. CowFaults,
  41. FileReadBytes,
  42. FileWriteBytes,
  43. UnixSocketReadBytes,
  44. UnixSocketWriteBytes,
  45. IPv4SocketReadBytes,
  46. IPv4SocketWriteBytes,
  47. __Count
  48. };
  49. static ProcessModel& the();
  50. static NonnullRefPtr<ProcessModel> create() { return adopt_ref(*new ProcessModel); }
  51. virtual ~ProcessModel() override;
  52. virtual int row_count(const GUI::ModelIndex&) const override;
  53. virtual int column_count(const GUI::ModelIndex&) const override;
  54. virtual String column_name(int column) const override;
  55. virtual GUI::Variant data(const GUI::ModelIndex&, GUI::ModelRole) const override;
  56. virtual void update() override;
  57. struct CpuInfo {
  58. u32 id;
  59. float total_cpu_percent { 0.0 };
  60. float total_cpu_percent_kernel { 0.0 };
  61. explicit CpuInfo(u32 id)
  62. : id(id)
  63. {
  64. }
  65. };
  66. Function<void(const NonnullOwnPtrVector<CpuInfo>&)> on_cpu_info_change;
  67. Function<void(int process_count, int thread_count)> on_state_update;
  68. const NonnullOwnPtrVector<CpuInfo>& cpus() const { return m_cpus; }
  69. private:
  70. ProcessModel();
  71. struct ThreadState {
  72. pid_t tid;
  73. pid_t pid;
  74. pid_t ppid;
  75. pid_t pgid;
  76. pid_t sid;
  77. unsigned ticks_user;
  78. unsigned ticks_kernel;
  79. bool kernel;
  80. String executable;
  81. String name;
  82. String state;
  83. String user;
  84. String pledge;
  85. String veil;
  86. u32 cpu;
  87. u32 priority;
  88. size_t amount_virtual;
  89. size_t amount_resident;
  90. size_t amount_dirty_private;
  91. size_t amount_clean_inode;
  92. size_t amount_purgeable_volatile;
  93. size_t amount_purgeable_nonvolatile;
  94. unsigned syscall_count;
  95. unsigned inode_faults;
  96. unsigned zero_faults;
  97. unsigned cow_faults;
  98. unsigned unix_socket_read_bytes;
  99. unsigned unix_socket_write_bytes;
  100. unsigned ipv4_socket_read_bytes;
  101. unsigned ipv4_socket_write_bytes;
  102. unsigned file_read_bytes;
  103. unsigned file_write_bytes;
  104. float cpu_percent;
  105. float cpu_percent_kernel;
  106. };
  107. struct Thread {
  108. ThreadState current_state;
  109. ThreadState previous_state;
  110. };
  111. HashMap<int, NonnullOwnPtr<Thread>> m_threads;
  112. NonnullOwnPtrVector<CpuInfo> m_cpus;
  113. Vector<int> m_tids;
  114. RefPtr<Core::File> m_proc_all;
  115. GUI::Icon m_kernel_process_icon;
  116. };