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