1 | //===-- PipePosix.h ---------------------------------------------*- C++ -*-===// |
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 | #ifndef LLDB_HOST_POSIX_PIPEPOSIX_H |
10 | #define LLDB_HOST_POSIX_PIPEPOSIX_H |
11 | #include "lldb/Host/PipeBase.h" |
12 | #include <mutex> |
13 | |
14 | namespace lldb_private { |
15 | |
16 | /// \class PipePosix PipePosix.h "lldb/Host/posix/PipePosix.h" |
17 | /// A posix-based implementation of Pipe, a class that abtracts |
18 | /// unix style pipes. |
19 | /// |
20 | /// A class that abstracts the LLDB core from host pipe functionality. |
21 | class PipePosix : public PipeBase { |
22 | public: |
23 | static int kInvalidDescriptor; |
24 | |
25 | PipePosix(); |
26 | PipePosix(lldb::pipe_t read, lldb::pipe_t write); |
27 | PipePosix(const PipePosix &) = delete; |
28 | PipePosix(PipePosix &&pipe_posix); |
29 | PipePosix &operator=(const PipePosix &) = delete; |
30 | PipePosix &operator=(PipePosix &&pipe_posix); |
31 | |
32 | ~PipePosix() override; |
33 | |
34 | Status CreateNew(bool child_process_inherit) override; |
35 | Status CreateNew(llvm::StringRef name, bool child_process_inherit) override; |
36 | Status CreateWithUniqueName(llvm::StringRef prefix, |
37 | bool child_process_inherit, |
38 | llvm::SmallVectorImpl<char> &name) override; |
39 | Status OpenAsReader(llvm::StringRef name, |
40 | bool child_process_inherit) override; |
41 | Status |
42 | OpenAsWriterWithTimeout(llvm::StringRef name, bool child_process_inherit, |
43 | const std::chrono::microseconds &timeout) override; |
44 | |
45 | bool CanRead() const override; |
46 | bool CanWrite() const override; |
47 | |
48 | lldb::pipe_t GetReadPipe() const override { |
49 | return lldb::pipe_t(GetReadFileDescriptor()); |
50 | } |
51 | lldb::pipe_t GetWritePipe() const override { |
52 | return lldb::pipe_t(GetWriteFileDescriptor()); |
53 | } |
54 | |
55 | int GetReadFileDescriptor() const override; |
56 | int GetWriteFileDescriptor() const override; |
57 | int ReleaseReadFileDescriptor() override; |
58 | int ReleaseWriteFileDescriptor() override; |
59 | void CloseReadFileDescriptor() override; |
60 | void CloseWriteFileDescriptor() override; |
61 | |
62 | // Close both descriptors |
63 | void Close() override; |
64 | |
65 | Status Delete(llvm::StringRef name) override; |
66 | |
67 | Status Write(const void *buf, size_t size, size_t &bytes_written) override; |
68 | Status ReadWithTimeout(void *buf, size_t size, |
69 | const std::chrono::microseconds &timeout, |
70 | size_t &bytes_read) override; |
71 | |
72 | private: |
73 | bool CanReadUnlocked() const; |
74 | bool CanWriteUnlocked() const; |
75 | |
76 | int GetReadFileDescriptorUnlocked() const; |
77 | int GetWriteFileDescriptorUnlocked() const; |
78 | int ReleaseReadFileDescriptorUnlocked(); |
79 | int ReleaseWriteFileDescriptorUnlocked(); |
80 | void CloseReadFileDescriptorUnlocked(); |
81 | void CloseWriteFileDescriptorUnlocked(); |
82 | void CloseUnlocked(); |
83 | |
84 | int m_fds[2]; |
85 | |
86 | /// Mutexes for m_fds; |
87 | mutable std::mutex m_read_mutex; |
88 | mutable std::mutex m_write_mutex; |
89 | }; |
90 | |
91 | } // namespace lldb_private |
92 | |
93 | #endif // LLDB_HOST_POSIX_PIPEPOSIX_H |
94 | |