wait_tree.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. // Copyright 2016 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <cstddef>
  6. #include <memory>
  7. #include <vector>
  8. #include <QAbstractItemModel>
  9. #include <QDockWidget>
  10. #include <QTreeView>
  11. #include "common/common_types.h"
  12. #include "core/hle/kernel/object.h"
  13. class EmuThread;
  14. namespace Kernel {
  15. class HandleTable;
  16. class KSynchronizationObject;
  17. class ReadableEvent;
  18. class Thread;
  19. } // namespace Kernel
  20. class WaitTreeThread;
  21. class WaitTreeItem : public QObject {
  22. Q_OBJECT
  23. public:
  24. WaitTreeItem();
  25. ~WaitTreeItem() override;
  26. virtual bool IsExpandable() const;
  27. virtual std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const;
  28. virtual QString GetText() const = 0;
  29. virtual QColor GetColor() const;
  30. void Expand();
  31. WaitTreeItem* Parent() const;
  32. const std::vector<std::unique_ptr<WaitTreeItem>>& Children() const;
  33. std::size_t Row() const;
  34. static std::vector<std::unique_ptr<WaitTreeThread>> MakeThreadItemList();
  35. private:
  36. std::size_t row;
  37. bool expanded = false;
  38. WaitTreeItem* parent = nullptr;
  39. std::vector<std::unique_ptr<WaitTreeItem>> children;
  40. };
  41. class WaitTreeText : public WaitTreeItem {
  42. Q_OBJECT
  43. public:
  44. explicit WaitTreeText(QString text);
  45. ~WaitTreeText() override;
  46. QString GetText() const override;
  47. private:
  48. QString text;
  49. };
  50. class WaitTreeExpandableItem : public WaitTreeItem {
  51. Q_OBJECT
  52. public:
  53. WaitTreeExpandableItem();
  54. ~WaitTreeExpandableItem() override;
  55. bool IsExpandable() const override;
  56. };
  57. class WaitTreeMutexInfo : public WaitTreeExpandableItem {
  58. Q_OBJECT
  59. public:
  60. explicit WaitTreeMutexInfo(VAddr mutex_address, const Kernel::HandleTable& handle_table);
  61. ~WaitTreeMutexInfo() override;
  62. QString GetText() const override;
  63. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  64. private:
  65. VAddr mutex_address;
  66. u32 mutex_value;
  67. Kernel::Handle owner_handle;
  68. std::shared_ptr<Kernel::Thread> owner;
  69. };
  70. class WaitTreeCallstack : public WaitTreeExpandableItem {
  71. Q_OBJECT
  72. public:
  73. explicit WaitTreeCallstack(const Kernel::Thread& thread);
  74. ~WaitTreeCallstack() override;
  75. QString GetText() const override;
  76. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  77. private:
  78. const Kernel::Thread& thread;
  79. };
  80. class WaitTreeSynchronizationObject : public WaitTreeExpandableItem {
  81. Q_OBJECT
  82. public:
  83. explicit WaitTreeSynchronizationObject(const Kernel::KSynchronizationObject& object);
  84. ~WaitTreeSynchronizationObject() override;
  85. static std::unique_ptr<WaitTreeSynchronizationObject> make(
  86. const Kernel::KSynchronizationObject& object);
  87. QString GetText() const override;
  88. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  89. protected:
  90. const Kernel::KSynchronizationObject& object;
  91. };
  92. class WaitTreeObjectList : public WaitTreeExpandableItem {
  93. Q_OBJECT
  94. public:
  95. WaitTreeObjectList(const std::vector<Kernel::KSynchronizationObject*>& list, bool wait_all);
  96. ~WaitTreeObjectList() override;
  97. QString GetText() const override;
  98. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  99. private:
  100. const std::vector<Kernel::KSynchronizationObject*>& object_list;
  101. bool wait_all;
  102. };
  103. class WaitTreeThread : public WaitTreeSynchronizationObject {
  104. Q_OBJECT
  105. public:
  106. explicit WaitTreeThread(const Kernel::Thread& thread);
  107. ~WaitTreeThread() override;
  108. QString GetText() const override;
  109. QColor GetColor() const override;
  110. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  111. };
  112. class WaitTreeEvent : public WaitTreeSynchronizationObject {
  113. Q_OBJECT
  114. public:
  115. explicit WaitTreeEvent(const Kernel::ReadableEvent& object);
  116. ~WaitTreeEvent() override;
  117. };
  118. class WaitTreeThreadList : public WaitTreeExpandableItem {
  119. Q_OBJECT
  120. public:
  121. explicit WaitTreeThreadList(const std::vector<Kernel::Thread*>& list);
  122. ~WaitTreeThreadList() override;
  123. QString GetText() const override;
  124. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  125. private:
  126. const std::vector<Kernel::Thread*>& thread_list;
  127. };
  128. class WaitTreeModel : public QAbstractItemModel {
  129. Q_OBJECT
  130. public:
  131. explicit WaitTreeModel(QObject* parent = nullptr);
  132. ~WaitTreeModel() override;
  133. QVariant data(const QModelIndex& index, int role) const override;
  134. QModelIndex index(int row, int column, const QModelIndex& parent) const override;
  135. QModelIndex parent(const QModelIndex& index) const override;
  136. int rowCount(const QModelIndex& parent) const override;
  137. int columnCount(const QModelIndex& parent) const override;
  138. void ClearItems();
  139. void InitItems();
  140. private:
  141. std::vector<std::unique_ptr<WaitTreeThread>> thread_items;
  142. };
  143. class WaitTreeWidget : public QDockWidget {
  144. Q_OBJECT
  145. public:
  146. explicit WaitTreeWidget(QWidget* parent = nullptr);
  147. ~WaitTreeWidget() override;
  148. public slots:
  149. void OnDebugModeEntered();
  150. void OnDebugModeLeft();
  151. void OnEmulationStarting(EmuThread* emu_thread);
  152. void OnEmulationStopping();
  153. private:
  154. QTreeView* view;
  155. WaitTreeModel* model;
  156. };