summaryrefslogtreecommitdiff
path: root/src/citron/debugger/wait_tree.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/citron/debugger/wait_tree.h')
-rw-r--r--src/citron/debugger/wait_tree.h188
1 files changed, 188 insertions, 0 deletions
diff --git a/src/citron/debugger/wait_tree.h b/src/citron/debugger/wait_tree.h
new file mode 100644
index 000000000..23c329fbe
--- /dev/null
+++ b/src/citron/debugger/wait_tree.h
@@ -0,0 +1,188 @@
+// SPDX-FileCopyrightText: 2016 Citra Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include <cstddef>
+#include <memory>
+#include <vector>
+
+#include <QDockWidget>
+#include <QTreeView>
+
+#include "common/common_types.h"
+#include "core/hle/kernel/k_auto_object.h"
+#include "core/hle/kernel/svc_common.h"
+
+class EmuThread;
+
+namespace Core {
+class System;
+}
+
+namespace Kernel {
+class KHandleTable;
+class KReadableEvent;
+class KSynchronizationObject;
+class KThread;
+} // namespace Kernel
+
+class WaitTreeThread;
+
+class WaitTreeItem : public QObject {
+ Q_OBJECT
+public:
+ WaitTreeItem();
+ ~WaitTreeItem() override;
+
+ virtual bool IsExpandable() const;
+ virtual std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const;
+ virtual QString GetText() const = 0;
+ virtual QColor GetColor() const;
+
+ void Expand();
+ WaitTreeItem* Parent() const;
+ const std::vector<std::unique_ptr<WaitTreeItem>>& Children() const;
+ std::size_t Row() const;
+ static std::vector<std::unique_ptr<WaitTreeThread>> MakeThreadItemList(Core::System& system);
+
+private:
+ std::size_t row;
+ bool expanded = false;
+ WaitTreeItem* parent = nullptr;
+ std::vector<std::unique_ptr<WaitTreeItem>> children;
+};
+
+class WaitTreeText : public WaitTreeItem {
+ Q_OBJECT
+public:
+ explicit WaitTreeText(QString text);
+ ~WaitTreeText() override;
+
+ QString GetText() const override;
+
+private:
+ QString text;
+};
+
+class WaitTreeExpandableItem : public WaitTreeItem {
+ Q_OBJECT
+public:
+ WaitTreeExpandableItem();
+ ~WaitTreeExpandableItem() override;
+
+ bool IsExpandable() const override;
+};
+
+class WaitTreeCallstack : public WaitTreeExpandableItem {
+ Q_OBJECT
+public:
+ explicit WaitTreeCallstack(const Kernel::KThread& thread_, Core::System& system_);
+ ~WaitTreeCallstack() override;
+
+ QString GetText() const override;
+ std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
+
+private:
+ const Kernel::KThread& thread;
+
+ Core::System& system;
+};
+
+class WaitTreeSynchronizationObject : public WaitTreeExpandableItem {
+ Q_OBJECT
+public:
+ explicit WaitTreeSynchronizationObject(const Kernel::KSynchronizationObject& object_,
+ Core::System& system_);
+ ~WaitTreeSynchronizationObject() override;
+
+ static std::unique_ptr<WaitTreeSynchronizationObject> make(
+ const Kernel::KSynchronizationObject& object, Core::System& system);
+ QString GetText() const override;
+ std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
+
+protected:
+ const Kernel::KSynchronizationObject& object;
+
+private:
+ Core::System& system;
+};
+
+class WaitTreeThread : public WaitTreeSynchronizationObject {
+ Q_OBJECT
+public:
+ explicit WaitTreeThread(const Kernel::KThread& thread, Core::System& system_);
+ ~WaitTreeThread() override;
+
+ QString GetText() const override;
+ QColor GetColor() const override;
+ std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
+
+private:
+ Core::System& system;
+};
+
+class WaitTreeEvent : public WaitTreeSynchronizationObject {
+ Q_OBJECT
+public:
+ explicit WaitTreeEvent(const Kernel::KReadableEvent& object_, Core::System& system_);
+ ~WaitTreeEvent() override;
+};
+
+class WaitTreeThreadList : public WaitTreeExpandableItem {
+ Q_OBJECT
+public:
+ explicit WaitTreeThreadList(std::vector<Kernel::KThread*>&& list, Core::System& system_);
+ ~WaitTreeThreadList() override;
+
+ QString GetText() const override;
+ std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
+
+private:
+ std::vector<Kernel::KThread*> thread_list;
+
+ Core::System& system;
+};
+
+class WaitTreeModel : public QAbstractItemModel {
+ Q_OBJECT
+
+public:
+ explicit WaitTreeModel(Core::System& system_, QObject* parent = nullptr);
+ ~WaitTreeModel() override;
+
+ QVariant data(const QModelIndex& index, int role) const override;
+ QModelIndex index(int row, int column, const QModelIndex& parent) const override;
+ QModelIndex parent(const QModelIndex& index) const override;
+ int rowCount(const QModelIndex& parent) const override;
+ int columnCount(const QModelIndex& parent) const override;
+
+ void ClearItems();
+ void InitItems();
+
+private:
+ std::vector<std::unique_ptr<WaitTreeThread>> thread_items;
+
+ Core::System& system;
+};
+
+class WaitTreeWidget : public QDockWidget {
+ Q_OBJECT
+
+public:
+ explicit WaitTreeWidget(Core::System& system_, QWidget* parent = nullptr);
+ ~WaitTreeWidget() override;
+
+public slots:
+ void OnDebugModeEntered();
+ void OnDebugModeLeft();
+
+ void OnEmulationStarting(EmuThread* emu_thread);
+ void OnEmulationStopping();
+
+private:
+ QTreeView* view;
+ WaitTreeModel* model;
+
+ Core::System& system;
+};