forked from OSchip/llvm-project
71 lines
1.8 KiB
C++
71 lines
1.8 KiB
C++
//===-- 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>
|
|
#if defined(__FreeBSD__)
|
|
#include <pthread_np.h>
|
|
#endif
|
|
#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);
|
|
}
|