200 lines
5.1 KiB
C
Raw Normal View History

2020-12-28 15:15:37 +00:00
// Copyright 2016 Citra Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#pragma once
#include <cstddef>
#include <memory>
#include <vector>
#include <QAbstractItemModel>
#include <QDockWidget>
#include <QTreeView>
#include "common/common_types.h"
2021-05-06 03:20:08 +02:00
#include "core/hle/kernel/object.h"
2020-12-28 15:15:37 +00:00
class EmuThread;
namespace Kernel {
2021-05-06 03:20:08 +02:00
class HandleTable;
2021-02-04 00:41:27 +01:00
class KReadableEvent;
2021-02-05 02:47:15 +01:00
class KSynchronizationObject;
2021-01-22 01:15:25 +01:00
class KThread;
2020-12-28 15:15:37 +00:00
} // 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();
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 WaitTreeMutexInfo : public WaitTreeExpandableItem {
Q_OBJECT
public:
2021-05-06 03:20:08 +02:00
explicit WaitTreeMutexInfo(VAddr mutex_address, const Kernel::HandleTable& handle_table);
2020-12-28 15:15:37 +00:00
~WaitTreeMutexInfo() override;
QString GetText() const override;
std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
private:
2021-05-06 03:20:08 +02:00
VAddr mutex_address;
u32 mutex_value;
Kernel::Handle owner_handle;
std::shared_ptr<Kernel::KThread> owner;
2020-12-28 15:15:37 +00:00
};
class WaitTreeCallstack : public WaitTreeExpandableItem {
Q_OBJECT
public:
2021-01-22 01:15:25 +01:00
explicit WaitTreeCallstack(const Kernel::KThread& thread);
2020-12-28 15:15:37 +00:00
~WaitTreeCallstack() override;
QString GetText() const override;
std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
private:
2021-01-22 01:15:25 +01:00
const Kernel::KThread& thread;
2020-12-28 15:15:37 +00:00
};
class WaitTreeSynchronizationObject : public WaitTreeExpandableItem {
Q_OBJECT
public:
2020-12-31 11:03:11 +01:00
explicit WaitTreeSynchronizationObject(const Kernel::KSynchronizationObject& object);
2020-12-28 15:15:37 +00:00
~WaitTreeSynchronizationObject() override;
static std::unique_ptr<WaitTreeSynchronizationObject> make(
2020-12-31 11:03:11 +01:00
const Kernel::KSynchronizationObject& object);
2020-12-28 15:15:37 +00:00
QString GetText() const override;
std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
protected:
2020-12-31 11:03:11 +01:00
const Kernel::KSynchronizationObject& object;
2020-12-28 15:15:37 +00:00
};
class WaitTreeObjectList : public WaitTreeExpandableItem {
Q_OBJECT
public:
2020-12-31 11:03:11 +01:00
WaitTreeObjectList(const std::vector<Kernel::KSynchronizationObject*>& list, bool wait_all);
2020-12-28 15:15:37 +00:00
~WaitTreeObjectList() override;
QString GetText() const override;
std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
private:
2020-12-31 11:03:11 +01:00
const std::vector<Kernel::KSynchronizationObject*>& object_list;
2020-12-28 15:15:37 +00:00
bool wait_all;
};
class WaitTreeThread : public WaitTreeSynchronizationObject {
Q_OBJECT
public:
2021-01-22 01:15:25 +01:00
explicit WaitTreeThread(const Kernel::KThread& thread);
2020-12-28 15:15:37 +00:00
~WaitTreeThread() override;
QString GetText() const override;
QColor GetColor() const override;
std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
};
class WaitTreeEvent : public WaitTreeSynchronizationObject {
Q_OBJECT
public:
2021-02-04 00:41:27 +01:00
explicit WaitTreeEvent(const Kernel::KReadableEvent& object);
2020-12-28 15:15:37 +00:00
~WaitTreeEvent() override;
};
class WaitTreeThreadList : public WaitTreeExpandableItem {
Q_OBJECT
public:
2021-05-06 03:20:08 +02:00
explicit WaitTreeThreadList(const std::vector<Kernel::KThread*>& list);
2020-12-28 15:15:37 +00:00
~WaitTreeThreadList() override;
QString GetText() const override;
std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
private:
2021-05-06 03:20:08 +02:00
const std::vector<Kernel::KThread*>& thread_list;
2020-12-28 15:15:37 +00:00
};
class WaitTreeModel : public QAbstractItemModel {
Q_OBJECT
public:
explicit WaitTreeModel(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;
};
class WaitTreeWidget : public QDockWidget {
Q_OBJECT
public:
explicit WaitTreeWidget(QWidget* parent = nullptr);
~WaitTreeWidget() override;
public slots:
void OnDebugModeEntered();
void OnDebugModeLeft();
void OnEmulationStarting(EmuThread* emu_thread);
void OnEmulationStopping();
private:
QTreeView* view;
WaitTreeModel* model;
};