wait_tree.h 4.9 KB

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