ProcessModel.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #pragma once
  2. #include <AK/HashMap.h>
  3. #include <AK/String.h>
  4. #include <AK/Vector.h>
  5. #include <LibGUI/GModel.h>
  6. #include <unistd.h>
  7. class GraphWidget;
  8. struct PidAndTid {
  9. bool operator==(const PidAndTid& other) const
  10. {
  11. return pid == other.pid && tid == other.tid;
  12. }
  13. pid_t pid;
  14. int tid;
  15. };
  16. class ProcessModel final : public GModel {
  17. public:
  18. enum Column {
  19. Icon = 0,
  20. Name,
  21. CPU,
  22. State,
  23. Priority,
  24. EffectivePriority,
  25. User,
  26. PID,
  27. TID,
  28. Virtual,
  29. Physical,
  30. DirtyPrivate,
  31. CleanInode,
  32. PurgeableVolatile,
  33. PurgeableNonvolatile,
  34. Pledge,
  35. Syscalls,
  36. InodeFaults,
  37. ZeroFaults,
  38. CowFaults,
  39. FileReadBytes,
  40. FileWriteBytes,
  41. UnixSocketReadBytes,
  42. UnixSocketWriteBytes,
  43. IPv4SocketReadBytes,
  44. IPv4SocketWriteBytes,
  45. __Count
  46. };
  47. static ProcessModel& the();
  48. static NonnullRefPtr<ProcessModel> create() { return adopt(*new ProcessModel); }
  49. virtual ~ProcessModel() override;
  50. virtual int row_count(const GModelIndex&) const override;
  51. virtual int column_count(const GModelIndex&) const override;
  52. virtual String column_name(int column) const override;
  53. virtual ColumnMetadata column_metadata(int column) const override;
  54. virtual GVariant data(const GModelIndex&, Role = Role::Display) const override;
  55. virtual void update() override;
  56. Function<void(float)> on_new_cpu_data_point;
  57. private:
  58. ProcessModel();
  59. struct ThreadState {
  60. int tid;
  61. pid_t pid;
  62. unsigned times_scheduled;
  63. String name;
  64. String state;
  65. String user;
  66. String pledge;
  67. u32 priority;
  68. u32 effective_priority;
  69. size_t amount_virtual;
  70. size_t amount_resident;
  71. size_t amount_dirty_private;
  72. size_t amount_clean_inode;
  73. size_t amount_purgeable_volatile;
  74. size_t amount_purgeable_nonvolatile;
  75. unsigned syscall_count;
  76. unsigned inode_faults;
  77. unsigned zero_faults;
  78. unsigned cow_faults;
  79. unsigned unix_socket_read_bytes;
  80. unsigned unix_socket_write_bytes;
  81. unsigned ipv4_socket_read_bytes;
  82. unsigned ipv4_socket_write_bytes;
  83. unsigned file_read_bytes;
  84. unsigned file_write_bytes;
  85. float cpu_percent;
  86. int icon_id;
  87. };
  88. struct Thread {
  89. ThreadState current_state;
  90. ThreadState previous_state;
  91. };
  92. HashMap<uid_t, String> m_usernames;
  93. HashMap<PidAndTid, NonnullOwnPtr<Thread>> m_threads;
  94. Vector<PidAndTid> m_pids;
  95. RefPtr<GraphicsBitmap> m_generic_process_icon;
  96. RefPtr<GraphicsBitmap> m_high_priority_icon;
  97. RefPtr<GraphicsBitmap> m_low_priority_icon;
  98. RefPtr<GraphicsBitmap> m_normal_priority_icon;
  99. };
  100. namespace AK {
  101. template<>
  102. struct Traits<PidAndTid> : public GenericTraits<PidAndTid> {
  103. static unsigned hash(const PidAndTid& value) { return pair_int_hash(value.pid, value.tid); }
  104. };
  105. }