Skip to content

[lldb][debugserver][NFC] Simplify macOS thread name fetching. #111684

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 26 additions & 22 deletions lldb/tools/debugserver/source/MacOSX/MachThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,8 @@ MachThread::MachThread(MachProcess *process, bool is_64_bit,
m_state(eStateUnloaded), m_state_mutex(PTHREAD_MUTEX_RECURSIVE),
m_suspend_count(0), m_stop_exception(),
m_arch_up(DNBArchProtocol::Create(this)), m_reg_sets(NULL),
m_num_reg_sets(0), m_ident_info(), m_proc_threadinfo(),
m_dispatch_queue_name(), m_is_64_bit(is_64_bit),
m_pthread_qos_class_decode(nullptr) {
m_num_reg_sets(0), m_extended_info(), m_dispatch_queue_name(),
m_is_64_bit(is_64_bit), m_pthread_qos_class_decode(nullptr) {
nub_size_t num_reg_sets = 0;
m_reg_sets = m_arch_up->GetRegisterSetInfo(&num_reg_sets);
m_num_reg_sets = num_reg_sets;
Expand Down Expand Up @@ -255,7 +254,7 @@ struct thread_basic_info *MachThread::GetBasicInfo() {
bool MachThread::GetBasicInfo(thread_t thread,
struct thread_basic_info *basicInfoPtr) {
if (MachPortNumberIsValid(thread)) {
unsigned int info_count = THREAD_BASIC_INFO_COUNT;
mach_msg_type_number_t info_count = THREAD_BASIC_INFO_COUNT;
kern_return_t err = ::thread_info(thread, THREAD_BASIC_INFO,
(thread_info_t)basicInfoPtr, &info_count);
if (err == KERN_SUCCESS)
Expand All @@ -265,6 +264,26 @@ bool MachThread::GetBasicInfo(thread_t thread,
return false;
}

struct thread_extended_info *MachThread::GetExtendedInfo() {
if (MachThread::GetExtendedInfo(m_mach_port_number, &m_extended_info))
return &m_extended_info;
return NULL;
}

bool MachThread::GetExtendedInfo(thread_t thread,
struct thread_extended_info *extendedInfoPtr) {
if (MachPortNumberIsValid(thread)) {
mach_msg_type_number_t info_count = THREAD_EXTENDED_INFO_COUNT;
kern_return_t err =
::thread_info(thread, THREAD_EXTENDED_INFO,
(thread_info_t)extendedInfoPtr, &info_count);
if (err == KERN_SUCCESS)
return true;
}
::memset(extendedInfoPtr, 0, sizeof(struct thread_extended_info));
return false;
}

bool MachThread::ThreadIDIsValid(uint64_t thread) { return thread != 0; }

bool MachThread::MachPortNumberIsValid(thread_t thread) {
Expand Down Expand Up @@ -579,28 +598,13 @@ uint32_t MachThread::NumSupportedHardwareWatchpoints() const {
return m_arch_up->NumSupportedHardwareWatchpoints();
}

bool MachThread::GetIdentifierInfo() {
const char *MachThread::GetName() {
// Don't try to get the thread info once and cache it for the life of the
// thread. It changes over time, for instance
// if the thread name changes, then the thread_handle also changes... So you
// have to refetch it every time.
mach_msg_type_number_t count = THREAD_IDENTIFIER_INFO_COUNT;
kern_return_t kret = ::thread_info(m_mach_port_number, THREAD_IDENTIFIER_INFO,
(thread_info_t)&m_ident_info, &count);
return kret == KERN_SUCCESS;

return false;
}

const char *MachThread::GetName() {
if (GetIdentifierInfo()) {
int len = ::proc_pidinfo(m_process->ProcessID(), PROC_PIDTHREADINFO,
m_ident_info.thread_handle, &m_proc_threadinfo,
sizeof(m_proc_threadinfo));

if (len && m_proc_threadinfo.pth_name[0])
return m_proc_threadinfo.pth_name;
}
if (GetExtendedInfo() && m_extended_info.pth_name[0])
return m_extended_info.pth_name;
return NULL;
}

Expand Down
8 changes: 4 additions & 4 deletions lldb/tools/debugserver/source/MacOSX/MachThread.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ class MachThread {

bool IsUserReady();
struct thread_basic_info *GetBasicInfo();
struct thread_extended_info *GetExtendedInfo();
const char *GetBasicInfoAsString() const;
const char *GetName();

Expand All @@ -126,8 +127,8 @@ class MachThread {
protected:
static bool GetBasicInfo(thread_t threadID,
struct thread_basic_info *basic_info);

bool GetIdentifierInfo();
static bool GetExtendedInfo(thread_t threadID,
struct thread_extended_info *extended_info);

// const char *
// GetDispatchQueueName();
Expand All @@ -152,8 +153,7 @@ class MachThread {
const DNBRegisterSetInfo
*m_reg_sets; // Register set information for this thread
nub_size_t m_num_reg_sets;
thread_identifier_info_data_t m_ident_info;
struct proc_threadinfo m_proc_threadinfo;
thread_extended_info_data_t m_extended_info;
std::string m_dispatch_queue_name;
bool m_is_64_bit;

Expand Down
Loading