wait_tree.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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 WaitTreeWaitObject : public WaitTreeExpandableItem {
  64. Q_OBJECT
  65. public:
  66. explicit WaitTreeWaitObject(const Kernel::WaitObject& object);
  67. static std::unique_ptr<WaitTreeWaitObject> make(const Kernel::WaitObject& object);
  68. QString GetText() const override;
  69. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  70. protected:
  71. const Kernel::WaitObject& object;
  72. static QString GetResetTypeQString(Kernel::ResetType reset_type);
  73. };
  74. class WaitTreeObjectList : public WaitTreeExpandableItem {
  75. Q_OBJECT
  76. public:
  77. WaitTreeObjectList(const std::vector<Kernel::SharedPtr<Kernel::WaitObject>>& list,
  78. bool wait_all);
  79. QString GetText() const override;
  80. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  81. private:
  82. const std::vector<Kernel::SharedPtr<Kernel::WaitObject>>& object_list;
  83. bool wait_all;
  84. };
  85. class WaitTreeThread : public WaitTreeWaitObject {
  86. Q_OBJECT
  87. public:
  88. explicit WaitTreeThread(const Kernel::Thread& thread);
  89. QString GetText() const override;
  90. QColor GetColor() const override;
  91. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  92. };
  93. class WaitTreeEvent : public WaitTreeWaitObject {
  94. Q_OBJECT
  95. public:
  96. explicit WaitTreeEvent(const Kernel::Event& object);
  97. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  98. };
  99. class WaitTreeTimer : public WaitTreeWaitObject {
  100. Q_OBJECT
  101. public:
  102. explicit WaitTreeTimer(const Kernel::Timer& object);
  103. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  104. };
  105. class WaitTreeThreadList : public WaitTreeExpandableItem {
  106. Q_OBJECT
  107. public:
  108. explicit WaitTreeThreadList(const std::vector<Kernel::SharedPtr<Kernel::Thread>>& list);
  109. QString GetText() const override;
  110. std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
  111. private:
  112. const std::vector<Kernel::SharedPtr<Kernel::Thread>>& thread_list;
  113. };
  114. class WaitTreeModel : public QAbstractItemModel {
  115. Q_OBJECT
  116. public:
  117. explicit WaitTreeModel(QObject* parent = nullptr);
  118. QVariant data(const QModelIndex& index, int role) const override;
  119. QModelIndex index(int row, int column, const QModelIndex& parent) const override;
  120. QModelIndex parent(const QModelIndex& index) const override;
  121. int rowCount(const QModelIndex& parent) const override;
  122. int columnCount(const QModelIndex& parent) const override;
  123. void ClearItems();
  124. void InitItems();
  125. private:
  126. std::vector<std::unique_ptr<WaitTreeThread>> thread_items;
  127. };
  128. class WaitTreeWidget : public QDockWidget {
  129. Q_OBJECT
  130. public:
  131. explicit WaitTreeWidget(QWidget* parent = nullptr);
  132. public slots:
  133. void OnDebugModeEntered();
  134. void OnDebugModeLeft();
  135. void OnEmulationStarting(EmuThread* emu_thread);
  136. void OnEmulationStopping();
  137. private:
  138. QTreeView* view;
  139. WaitTreeModel* model;
  140. };