blob: 7cabde202518ea69339bac452b38f1f8a7241faf [file] [log] [blame]
//===-- ThreadMemory.h ------------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_THREADMEMORY_H
#define LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_THREADMEMORY_H
#include <string>
#include "lldb/Target/Thread.h"
/// A memory thread with its own ID, optionally backed by a real thread.
/// Most methods of this class dispatch to the real thread if it is not null.
/// Notable exceptions are the methods calculating the StopInfo and
/// RegisterContext of the thread, those may query the OS plugin that created
/// the thread.
class ThreadMemory : public lldb_private::Thread {
public:
ThreadMemory(lldb_private::Process &process, lldb::tid_t tid,
lldb::addr_t register_data_addr)
: Thread(process, tid), m_register_data_addr(register_data_addr) {}
~ThreadMemory() override;
lldb::RegisterContextSP GetRegisterContext() override;
lldb::RegisterContextSP
CreateRegisterContextForFrame(lldb_private::StackFrame *frame) override;
bool CalculateStopInfo() override;
const char *GetInfo() override {
if (m_backing_thread_sp)
return m_backing_thread_sp->GetInfo();
return nullptr;
}
const char *GetName() override {
if (m_backing_thread_sp)
return m_backing_thread_sp->GetName();
return nullptr;
}
const char *GetQueueName() override {
if (m_backing_thread_sp)
return m_backing_thread_sp->GetQueueName();
return nullptr;
}
void WillResume(lldb::StateType resume_state) override;
void DidResume() override {
if (m_backing_thread_sp)
m_backing_thread_sp->DidResume();
}
lldb::user_id_t GetProtocolID() const override {
if (m_backing_thread_sp)
return m_backing_thread_sp->GetProtocolID();
return Thread::GetProtocolID();
}
void RefreshStateAfterStop() override;
void ClearStackFrames() override;
void ClearBackingThread() override {
if (m_backing_thread_sp)
m_backing_thread_sp->ClearBackedThread();
m_backing_thread_sp.reset();
}
bool SetBackingThread(const lldb::ThreadSP &thread_sp) override {
m_backing_thread_sp = thread_sp;
thread_sp->SetBackedThread(*this);
return thread_sp.get();
}
lldb::ThreadSP GetBackingThread() const override {
return m_backing_thread_sp;
}
bool IsOperatingSystemPluginThread() const override { return true; }
private:
lldb::addr_t m_register_data_addr;
lldb::ThreadSP m_backing_thread_sp;
ThreadMemory(const ThreadMemory &) = delete;
const ThreadMemory &operator=(const ThreadMemory &) = delete;
};
/// A ThreadMemory that optionally overrides the thread name.
class ThreadMemoryProvidingName : public ThreadMemory {
public:
ThreadMemoryProvidingName(lldb_private::Process &process, lldb::tid_t tid,
lldb::addr_t register_data_addr,
llvm::StringRef name)
: ThreadMemory(process, tid, register_data_addr), m_name(name) {}
const char *GetName() override {
if (!m_name.empty())
return m_name.c_str();
return ThreadMemory::GetName();
}
~ThreadMemoryProvidingName() override = default;
private:
std::string m_name;
};
/// A ThreadMemoryProvidingName that optionally overrides queue information.
class ThreadMemoryProvidingNameAndQueue : public ThreadMemoryProvidingName {
public:
ThreadMemoryProvidingNameAndQueue(
lldb_private::Process &process, lldb::tid_t tid,
const lldb::ValueObjectSP &thread_info_valobj_sp);
ThreadMemoryProvidingNameAndQueue(lldb_private::Process &process,
lldb::tid_t tid, llvm::StringRef name,
llvm::StringRef queue,
lldb::addr_t register_data_addr);
~ThreadMemoryProvidingNameAndQueue() override = default;
const char *GetQueueName() override {
if (!m_queue.empty())
return m_queue.c_str();
return ThreadMemory::GetQueueName();
}
lldb::ValueObjectSP &GetValueObject() { return m_thread_info_valobj_sp; }
protected:
lldb::ValueObjectSP m_thread_info_valobj_sp;
std::string m_queue;
private:
ThreadMemoryProvidingNameAndQueue(const ThreadMemoryProvidingNameAndQueue &) =
delete;
const ThreadMemoryProvidingNameAndQueue &
operator=(const ThreadMemoryProvidingNameAndQueue &) = delete;
};
#endif // LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_THREADMEMORY_H