llvm-project/lldb/source/Host/windows/ThisThread.cpp

67 lines
1.8 KiB
C++

//===-- ThisThread.cpp ------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "lldb/Core/Error.h"
#include "lldb/Host/windows/windows.h"
#include "lldb/Host/ThisThread.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallVector.h"
using namespace lldb;
using namespace lldb_private;
#if defined(_MSC_VER) && !defined(__clang__)
namespace
{
static const DWORD MS_VC_EXCEPTION = 0x406D1388;
#pragma pack(push, 8)
struct THREADNAME_INFO
{
DWORD dwType; // Must be 0x1000.
LPCSTR szName; // Pointer to thread name
DWORD dwThreadId; // Thread ID (-1 == current thread)
DWORD dwFlags; // Reserved. Do not use.
};
#pragma pack(pop)
}
#endif
void
ThisThread::SetName(llvm::StringRef name)
{
// Other compilers don't yet support SEH, so we can only set the thread if compiling with MSVC.
// TODO(zturner): Once clang-cl supports SEH, relax this conditional.
#if defined(_MSC_VER) && !defined(__clang__)
THREADNAME_INFO info;
info.dwType = 0x1000;
info.szName = name.data();
info.dwThreadId = ::GetCurrentThreadId();
info.dwFlags = 0;
__try {
::RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR *)&info);
}
__except(EXCEPTION_EXECUTE_HANDLER) {}
#endif
}
void
ThisThread::GetName(llvm::SmallVectorImpl<char> &name)
{
// Getting the thread name is not supported on Windows.
// TODO(zturner): In SetName(), make a TLS entry that contains the thread's name, and in this function
// try to extract that TLS entry.
name.clear();
}