@@ -31,9 +31,8 @@ MachThread::MachThread(MachProcess *process, bool is_64_bit,
3131 m_state(eStateUnloaded), m_state_mutex(PTHREAD_MUTEX_RECURSIVE),
3232 m_suspend_count(0 ), m_stop_exception(),
3333 m_arch_up(DNBArchProtocol::Create(this )), m_reg_sets(NULL ),
34- m_num_reg_sets(0 ), m_ident_info(), m_proc_threadinfo(),
35- m_dispatch_queue_name(), m_is_64_bit(is_64_bit),
36- m_pthread_qos_class_decode(nullptr ) {
34+ m_num_reg_sets(0 ), m_extended_info(), m_dispatch_queue_name(),
35+ m_is_64_bit(is_64_bit), m_pthread_qos_class_decode(nullptr ) {
3736 nub_size_t num_reg_sets = 0 ;
3837 m_reg_sets = m_arch_up->GetRegisterSetInfo (&num_reg_sets);
3938 m_num_reg_sets = num_reg_sets;
@@ -255,7 +254,7 @@ struct thread_basic_info *MachThread::GetBasicInfo() {
255254bool MachThread::GetBasicInfo (thread_t thread,
256255 struct thread_basic_info *basicInfoPtr) {
257256 if (MachPortNumberIsValid (thread)) {
258- unsigned int info_count = THREAD_BASIC_INFO_COUNT;
257+ mach_msg_type_number_t info_count = THREAD_BASIC_INFO_COUNT;
259258 kern_return_t err = ::thread_info (thread, THREAD_BASIC_INFO,
260259 (thread_info_t )basicInfoPtr, &info_count);
261260 if (err == KERN_SUCCESS)
@@ -265,6 +264,26 @@ bool MachThread::GetBasicInfo(thread_t thread,
265264 return false ;
266265}
267266
267+ struct thread_extended_info *MachThread::GetExtendedInfo () {
268+ if (MachThread::GetExtendedInfo (m_mach_port_number, &m_extended_info))
269+ return &m_extended_info;
270+ return NULL ;
271+ }
272+
273+ bool MachThread::GetExtendedInfo (thread_t thread,
274+ struct thread_extended_info *extendedInfoPtr) {
275+ if (MachPortNumberIsValid (thread)) {
276+ mach_msg_type_number_t info_count = THREAD_EXTENDED_INFO_COUNT;
277+ kern_return_t err =
278+ ::thread_info (thread, THREAD_EXTENDED_INFO,
279+ (thread_info_t )extendedInfoPtr, &info_count);
280+ if (err == KERN_SUCCESS)
281+ return true ;
282+ }
283+ ::memset (extendedInfoPtr, 0 , sizeof (struct thread_extended_info ));
284+ return false ;
285+ }
286+
268287bool MachThread::ThreadIDIsValid (uint64_t thread) { return thread != 0 ; }
269288
270289bool MachThread::MachPortNumberIsValid (thread_t thread) {
@@ -579,28 +598,13 @@ uint32_t MachThread::NumSupportedHardwareWatchpoints() const {
579598 return m_arch_up->NumSupportedHardwareWatchpoints ();
580599}
581600
582- bool MachThread::GetIdentifierInfo () {
601+ const char * MachThread::GetName () {
583602 // Don't try to get the thread info once and cache it for the life of the
584603 // thread. It changes over time, for instance
585604 // if the thread name changes, then the thread_handle also changes... So you
586605 // have to refetch it every time.
587- mach_msg_type_number_t count = THREAD_IDENTIFIER_INFO_COUNT;
588- kern_return_t kret = ::thread_info (m_mach_port_number, THREAD_IDENTIFIER_INFO,
589- (thread_info_t )&m_ident_info, &count);
590- return kret == KERN_SUCCESS;
591-
592- return false ;
593- }
594-
595- const char *MachThread::GetName () {
596- if (GetIdentifierInfo ()) {
597- int len = ::proc_pidinfo (m_process->ProcessID (), PROC_PIDTHREADINFO,
598- m_ident_info.thread_handle , &m_proc_threadinfo,
599- sizeof (m_proc_threadinfo));
600-
601- if (len && m_proc_threadinfo.pth_name [0 ])
602- return m_proc_threadinfo.pth_name ;
603- }
606+ if (GetExtendedInfo () && m_extended_info.pth_name [0 ])
607+ return m_extended_info.pth_name ;
604608 return NULL ;
605609}
606610
0 commit comments