180814287SRaphael Isemann //===-- HostThreadWindows.cpp ---------------------------------------------===//
239de3110SZachary Turner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
639de3110SZachary Turner //
739de3110SZachary Turner //===----------------------------------------------------------------------===//
839de3110SZachary Turner
997206d57SZachary Turner #include "lldb/Utility/Status.h"
1039de3110SZachary Turner
1139de3110SZachary Turner #include "lldb/Host/windows/HostThreadWindows.h"
12b9c1b51eSKate Stone #include "lldb/Host/windows/windows.h"
1339de3110SZachary Turner
1439de3110SZachary Turner #include "llvm/ADT/STLExtras.h"
1539de3110SZachary Turner
1639de3110SZachary Turner using namespace lldb;
1739de3110SZachary Turner using namespace lldb_private;
1839de3110SZachary Turner
ExitThreadProxy(ULONG_PTR dwExitCode)19*93c1b3caSPavel Labath static void __stdcall ExitThreadProxy(ULONG_PTR dwExitCode) {
207ae4b6deSZachary Turner ::ExitThread(dwExitCode);
217ae4b6deSZachary Turner }
227ae4b6deSZachary Turner
HostThreadWindows()2339de3110SZachary Turner HostThreadWindows::HostThreadWindows()
24b9c1b51eSKate Stone : HostNativeThreadBase(), m_owns_handle(true) {}
2539de3110SZachary Turner
HostThreadWindows(lldb::thread_t thread)2639de3110SZachary Turner HostThreadWindows::HostThreadWindows(lldb::thread_t thread)
27b9c1b51eSKate Stone : HostNativeThreadBase(thread), m_owns_handle(true) {}
2839de3110SZachary Turner
~HostThreadWindows()29b9c1b51eSKate Stone HostThreadWindows::~HostThreadWindows() { Reset(); }
3039de3110SZachary Turner
SetOwnsHandle(bool owns)31b9c1b51eSKate Stone void HostThreadWindows::SetOwnsHandle(bool owns) { m_owns_handle = owns; }
32742346a2SZachary Turner
Join(lldb::thread_result_t * result)3397206d57SZachary Turner Status HostThreadWindows::Join(lldb::thread_result_t *result) {
3497206d57SZachary Turner Status error;
35b9c1b51eSKate Stone if (IsJoinable()) {
36acee96aeSZachary Turner DWORD wait_result = ::WaitForSingleObject(m_thread, INFINITE);
37b9c1b51eSKate Stone if (WAIT_OBJECT_0 == wait_result && result) {
38acee96aeSZachary Turner DWORD exit_code = 0;
39acee96aeSZachary Turner if (!::GetExitCodeThread(m_thread, &exit_code))
4039de3110SZachary Turner *result = 0;
41acee96aeSZachary Turner *result = exit_code;
42b9c1b51eSKate Stone } else if (WAIT_OBJECT_0 != wait_result)
43acee96aeSZachary Turner error.SetError(::GetLastError(), eErrorTypeWin32);
44b9c1b51eSKate Stone } else
45acee96aeSZachary Turner error.SetError(ERROR_INVALID_HANDLE, eErrorTypeWin32);
4601db5384SHafiz Abid Qadeer
4701db5384SHafiz Abid Qadeer Reset();
4839de3110SZachary Turner return error;
4939de3110SZachary Turner }
5039de3110SZachary Turner
Cancel()5197206d57SZachary Turner Status HostThreadWindows::Cancel() {
5297206d57SZachary Turner Status error;
5339de3110SZachary Turner
547ae4b6deSZachary Turner DWORD result = ::QueueUserAPC(::ExitThreadProxy, m_thread, 0);
5539de3110SZachary Turner error.SetError(result, eErrorTypeWin32);
5639de3110SZachary Turner return error;
5739de3110SZachary Turner }
5839de3110SZachary Turner
GetThreadId() const59b9c1b51eSKate Stone lldb::tid_t HostThreadWindows::GetThreadId() const {
6039de3110SZachary Turner return ::GetThreadId(m_thread);
6139de3110SZachary Turner }
6239de3110SZachary Turner
Reset()63b9c1b51eSKate Stone void HostThreadWindows::Reset() {
64742346a2SZachary Turner if (m_owns_handle && m_thread != LLDB_INVALID_HOST_THREAD)
6539de3110SZachary Turner ::CloseHandle(m_thread);
6639de3110SZachary Turner
6739de3110SZachary Turner HostNativeThreadBase::Reset();
6839de3110SZachary Turner }
6964c92df7SAleksandr Urakov
EqualsThread(lldb::thread_t thread) const7064c92df7SAleksandr Urakov bool HostThreadWindows::EqualsThread(lldb::thread_t thread) const {
7164c92df7SAleksandr Urakov return GetThreadId() == ::GetThreadId(thread);
7264c92df7SAleksandr Urakov }
73