xref: /freebsd/contrib/llvm-project/lldb/source/Host/posix/HostThreadPosix.cpp (revision fe6060f10f634930ff71b7c50291ddc610da2475)
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)20 HostThreadPosix::HostThreadPosix(lldb::thread_t thread)
21     : HostNativeThreadBase(thread) {}
22 
23 HostThreadPosix::~HostThreadPosix() = default;
24 
Join(lldb::thread_result_t * result)25 Status 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()40 Status 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()53 Status 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