wait_tree.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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 ReadableEvent;
  16. class WaitObject;
  17. class Thread;
  18. class Timer;
  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(const 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);
  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. Kernel::SharedPtr<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 WaitTreeWaitObject : public WaitTreeExpandableItem {
  81. Q_OBJECT
  82. public:
  83. explicit WaitTreeWaitObject(const Kernel::WaitObject& object);
  84. ~WaitTreeWaitObject() override;
  85. static std::unique_ptr<WaitTreeWaitObject> make(const Kernel::WaitObject& object);
  86. QString GetText() const override;
  87. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  88. protected:
  89. const Kernel::WaitObject& object;
  90. static QString GetResetTypeQString(Kernel::ResetType reset_type);
  91. };
  92. class WaitTreeObjectList : public WaitTreeExpandableItem {
  93. Q_OBJECT
  94. public:
  95. WaitTreeObjectList(const std::vector<Kernel::SharedPtr<Kernel::WaitObject>>& list,
  96. bool wait_all);
  97. ~WaitTreeObjectList() override;
  98. QString GetText() const override;
  99. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  100. private:
  101. const std::vector<Kernel::SharedPtr<Kernel::WaitObject>>& object_list;
  102. bool wait_all;
  103. };
  104. class WaitTreeThread : public WaitTreeWaitObject {
  105. Q_OBJECT
  106. public:
  107. explicit WaitTreeThread(const Kernel::Thread& thread);
  108. ~WaitTreeThread() override;
  109. QString GetText() const override;
  110. QColor GetColor() const override;
  111. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  112. };
  113. class WaitTreeEvent : public WaitTreeWaitObject {
  114. Q_OBJECT
  115. public:
  116. explicit WaitTreeEvent(const Kernel::ReadableEvent& object);
  117. ~WaitTreeEvent() override;
  118. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  119. };
  120. class WaitTreeTimer : public WaitTreeWaitObject {
  121. Q_OBJECT
  122. public:
  123. explicit WaitTreeTimer(const Kernel::Timer& object);
  124. ~WaitTreeTimer() override;
  125. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  126. };
  127. class WaitTreeThreadList : public WaitTreeExpandableItem {
  128. Q_OBJECT
  129. public:
  130. explicit WaitTreeThreadList(const std::vector<Kernel::SharedPtr<Kernel::Thread>>& list);
  131. ~WaitTreeThreadList() override;
  132. QString GetText() const override;
  133. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  134. private:
  135. const std::vector<Kernel::SharedPtr<Kernel::Thread>>& thread_list;
  136. };
  137. class WaitTreeModel : public QAbstractItemModel {
  138. Q_OBJECT
  139. public:
  140. explicit WaitTreeModel(QObject* parent = nullptr);
  141. ~WaitTreeModel() override;
  142. QVariant data(const QModelIndex& index, int role) const override;
  143. QModelIndex index(int row, int column, const QModelIndex& parent) const override;
  144. QModelIndex parent(const QModelIndex& index) const override;
  145. int rowCount(const QModelIndex& parent) const override;
  146. int columnCount(const QModelIndex& parent) const override;
  147. void ClearItems();
  148. void InitItems();
  149. private:
  150. std::vector<std::unique_ptr<WaitTreeThread>> thread_items;
  151. };
  152. class WaitTreeWidget : public QDockWidget {
  153. Q_OBJECT
  154. public:
  155. explicit WaitTreeWidget(QWidget* parent = nullptr);
  156. ~WaitTreeWidget() override;
  157. public slots:
  158. void OnDebugModeEntered();
  159. void OnDebugModeLeft();
  160. void OnEmulationStarting(EmuThread* emu_thread);
  161. void OnEmulationStopping();
  162. private:
  163. QTreeView* view;
  164. WaitTreeModel* model;
  165. };