|  | //===-- HostThreadFreeBSD.cpp -----------------------------------*- C++ -*-===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | // lldb Includes | 
|  | #include "lldb/Host/freebsd/HostThreadFreeBSD.h" | 
|  | #include "lldb/Host/Host.h" | 
|  |  | 
|  | // C includes | 
|  | #include <errno.h> | 
|  | #include <pthread.h> | 
|  | #include <pthread_np.h> | 
|  | #include <stdlib.h> | 
|  | #include <sys/sysctl.h> | 
|  | #include <sys/user.h> | 
|  |  | 
|  | // C++ includes | 
|  | #include <string> | 
|  |  | 
|  | using namespace lldb_private; | 
|  |  | 
|  | HostThreadFreeBSD::HostThreadFreeBSD() | 
|  | { | 
|  | } | 
|  |  | 
|  | HostThreadFreeBSD::HostThreadFreeBSD(lldb::thread_t thread) | 
|  | : HostThreadPosix(thread) | 
|  | { | 
|  | } | 
|  |  | 
|  | void | 
|  | HostThreadFreeBSD::GetName(lldb::tid_t tid, llvm::SmallVectorImpl<char> &name) | 
|  | { | 
|  | name.clear(); | 
|  | int pid = Host::GetCurrentProcessID(); | 
|  |  | 
|  | struct kinfo_proc *kp = nullptr, *nkp; | 
|  | size_t len = 0; | 
|  | int error; | 
|  | int ctl[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID | KERN_PROC_INC_THREAD, (int)pid}; | 
|  |  | 
|  | while (1) | 
|  | { | 
|  | error = sysctl(ctl, 4, kp, &len, nullptr, 0); | 
|  | if (kp == nullptr || (error != 0 && errno == ENOMEM)) | 
|  | { | 
|  | // Add extra space in case threads are added before next call. | 
|  | len += sizeof(*kp) + len / 10; | 
|  | nkp = (struct kinfo_proc *)realloc(kp, len); | 
|  | if (nkp == nullptr) | 
|  | { | 
|  | free(kp); | 
|  | return; | 
|  | } | 
|  | kp = nkp; | 
|  | continue; | 
|  | } | 
|  | if (error != 0) | 
|  | len = 0; | 
|  | break; | 
|  | } | 
|  |  | 
|  | for (size_t i = 0; i < len / sizeof(*kp); i++) | 
|  | { | 
|  | if (kp[i].ki_tid == (lwpid_t)tid) | 
|  | { | 
|  | name.append(kp[i].ki_tdname, kp[i].ki_tdname + strlen(kp[i].ki_tdname)); | 
|  | break; | 
|  | } | 
|  | } | 
|  | free(kp); | 
|  | } |