1 //===-- HostThreadPosix.cpp -----------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "lldb/Host/posix/HostThreadPosix.h" 10 #include "lldb/Utility/Status.h" 11 12 #include <cerrno> 13 #include <pthread.h> 14 15 using namespace lldb; 16 using namespace lldb_private; 17 18 HostThreadPosix::HostThreadPosix() = default; 19 HostThreadPosix(lldb::thread_t thread)20HostThreadPosix::HostThreadPosix(lldb::thread_t thread) 21 : HostNativeThreadBase(thread) {} 22 23 HostThreadPosix::~HostThreadPosix() = default; 24 Join(lldb::thread_result_t * result)25Status HostThreadPosix::Join(lldb::thread_result_t *result) { 26 Status error; 27 if (IsJoinable()) { 28 int err = ::pthread_join(m_thread, result); 29 error.SetError(err, lldb::eErrorTypePOSIX); 30 } else { 31 if (result) 32 *result = nullptr; 33 error.SetError(EINVAL, eErrorTypePOSIX); 34 } 35 36 Reset(); 37 return error; 38 } 39 Cancel()40Status HostThreadPosix::Cancel() { 41 Status error; 42 if (IsJoinable()) { 43 #ifndef __FreeBSD__ 44 llvm_unreachable("someone is calling HostThread::Cancel()"); 45 #else 46 int err = ::pthread_cancel(m_thread); 47 error.SetError(err, eErrorTypePOSIX); 48 #endif 49 } 50 return error; 51 } 52 Detach()53Status HostThreadPosix::Detach() { 54 Status error; 55 if (IsJoinable()) { 56 int err = ::pthread_detach(m_thread); 57 error.SetError(err, eErrorTypePOSIX); 58 } 59 Reset(); 60 return error; 61 } 62