Qt/WaitTree: Display the callstack for each thread in the wait tree widget.
This commit is contained in:
		@@ -98,6 +98,30 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeMutexInfo::GetChildren() cons
 | 
			
		||||
    return list;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
WaitTreeCallstack::WaitTreeCallstack(const Kernel::Thread& thread) : thread(thread) {}
 | 
			
		||||
 | 
			
		||||
QString WaitTreeCallstack::GetText() const {
 | 
			
		||||
    return tr("Call stack");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeCallstack::GetChildren() const {
 | 
			
		||||
    std::vector<std::unique_ptr<WaitTreeItem>> list;
 | 
			
		||||
 | 
			
		||||
    constexpr size_t BaseRegister = 29;
 | 
			
		||||
    u64 base_pointer = thread.context.cpu_registers[BaseRegister];
 | 
			
		||||
 | 
			
		||||
    while (base_pointer != 0) {
 | 
			
		||||
        u64 lr = Memory::Read64(base_pointer + sizeof(u64));
 | 
			
		||||
        if (lr == 0)
 | 
			
		||||
            break;
 | 
			
		||||
        list.push_back(
 | 
			
		||||
            std::make_unique<WaitTreeText>(tr("0x%1").arg(lr - sizeof(u32), 16, 16, QChar('0'))));
 | 
			
		||||
        base_pointer = Memory::Read64(base_pointer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return list;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
WaitTreeWaitObject::WaitTreeWaitObject(const Kernel::WaitObject& o) : object(o) {}
 | 
			
		||||
 | 
			
		||||
bool WaitTreeExpandableItem::IsExpandable() const {
 | 
			
		||||
@@ -269,6 +293,8 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeThread::GetChildren() const {
 | 
			
		||||
                                                            thread.IsSleepingOnWaitAll()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    list.push_back(std::make_unique<WaitTreeCallstack>(thread));
 | 
			
		||||
 | 
			
		||||
    return list;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -73,6 +73,17 @@ private:
 | 
			
		||||
    Kernel::SharedPtr<Kernel::Thread> owner;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class WaitTreeCallstack : public WaitTreeExpandableItem {
 | 
			
		||||
    Q_OBJECT
 | 
			
		||||
public:
 | 
			
		||||
    explicit WaitTreeCallstack(const Kernel::Thread& thread);
 | 
			
		||||
    QString GetText() const override;
 | 
			
		||||
    std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    const Kernel::Thread& thread;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class WaitTreeWaitObject : public WaitTreeExpandableItem {
 | 
			
		||||
    Q_OBJECT
 | 
			
		||||
public:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user