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 | |
20 | HostThreadPosix::HostThreadPosix(lldb::thread_t thread) |
21 | : HostNativeThreadBase(thread) {} |
22 | |
23 | HostThreadPosix::~HostThreadPosix() = default; |
24 | |
25 | Status HostThreadPosix::Join(lldb::thread_result_t *result) { |
26 | Status error; |
27 | if (IsJoinable()) { |
28 | int err = ::pthread_join(th: m_thread, thread_return: result); |
29 | error.SetError(err, type: lldb::eErrorTypePOSIX); |
30 | } else { |
31 | if (result) |
32 | *result = nullptr; |
33 | error.SetError(EINVAL, type: eErrorTypePOSIX); |
34 | } |
35 | |
36 | Reset(); |
37 | return error; |
38 | } |
39 | |
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 | |
53 | Status HostThreadPosix::Detach() { |
54 | Status error; |
55 | if (IsJoinable()) { |
56 | int err = ::pthread_detach(th: m_thread); |
57 | error.SetError(err, type: eErrorTypePOSIX); |
58 | } |
59 | Reset(); |
60 | return error; |
61 | } |
62 |