diff options
Diffstat (limited to 'contrib/llvm/tools/lldb/source/Host/common/Pipe.cpp')
-rw-r--r-- | contrib/llvm/tools/lldb/source/Host/common/Pipe.cpp | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/contrib/llvm/tools/lldb/source/Host/common/Pipe.cpp b/contrib/llvm/tools/lldb/source/Host/common/Pipe.cpp new file mode 100644 index 0000000..4db0e32 --- /dev/null +++ b/contrib/llvm/tools/lldb/source/Host/common/Pipe.cpp @@ -0,0 +1,171 @@ +//===-- Pipe.cpp ------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Host/Pipe.h" + +#if defined(_WIN32) +#include <io.h> +#include <fcntl.h> +#else +#include <unistd.h> +#endif + +using namespace lldb_private; + +int Pipe::kInvalidDescriptor = -1; + +enum PIPES { READ, WRITE }; // Constants 0 and 1 for READ and WRITE + +Pipe::Pipe() +{ + m_fds[READ] = Pipe::kInvalidDescriptor; + m_fds[WRITE] = Pipe::kInvalidDescriptor; +} + +Pipe::~Pipe() +{ + Close(); +} + +bool +Pipe::Open() +{ + if (IsValid()) + return true; + +#ifdef _WIN32 + if (::_pipe(m_fds, 256, O_BINARY) == 0) + return true; +#else + if (::pipe(m_fds) == 0) + return true; +#endif + m_fds[READ] = Pipe::kInvalidDescriptor; + m_fds[WRITE] = Pipe::kInvalidDescriptor; + return false; +} + +int +Pipe::GetReadFileDescriptor() const +{ + return m_fds[READ]; +} + +int +Pipe::GetWriteFileDescriptor() const +{ + return m_fds[WRITE]; +} + +int +Pipe::ReleaseReadFileDescriptor() +{ + const int fd = m_fds[READ]; + m_fds[READ] = Pipe::kInvalidDescriptor; + return fd; +} + +int +Pipe::ReleaseWriteFileDescriptor() +{ + const int fd = m_fds[WRITE]; + m_fds[WRITE] = Pipe::kInvalidDescriptor; + return fd; +} + +void +Pipe::Close() +{ + CloseReadFileDescriptor(); + CloseWriteFileDescriptor(); +} + +bool +Pipe::ReadDescriptorIsValid() const +{ + return m_fds[READ] != Pipe::kInvalidDescriptor; +} + +bool +Pipe::WriteDescriptorIsValid() const +{ + return m_fds[WRITE] != Pipe::kInvalidDescriptor; +} + +bool +Pipe::IsValid() const +{ + return ReadDescriptorIsValid() && WriteDescriptorIsValid(); +} + +bool +Pipe::CloseReadFileDescriptor() +{ + if (ReadDescriptorIsValid()) + { + int err; +#ifdef _WIN32 + err = _close(m_fds[READ]); +#else + err = close(m_fds[READ]); +#endif + m_fds[READ] = Pipe::kInvalidDescriptor; + return err == 0; + } + return true; +} + +bool +Pipe::CloseWriteFileDescriptor() +{ + if (WriteDescriptorIsValid()) + { + int err; +#ifdef _WIN32 + err = _close(m_fds[WRITE]); +#else + err = close(m_fds[WRITE]); +#endif + m_fds[WRITE] = Pipe::kInvalidDescriptor; + return err == 0; + } + return true; +} + + +size_t +Pipe::Read (void *buf, size_t num_bytes) +{ + if (ReadDescriptorIsValid()) + { + const int fd = GetReadFileDescriptor(); +#ifdef _WIN32 + return _read (fd, (char *)buf, num_bytes); +#else + return read (fd, buf, num_bytes); +#endif + } + return 0; // Return 0 since errno won't be set if we didn't call read +} + +size_t +Pipe::Write (const void *buf, size_t num_bytes) +{ + if (WriteDescriptorIsValid()) + { + const int fd = GetWriteFileDescriptor(); +#ifdef _WIN32 + return _write (fd, (char *)buf, num_bytes); +#else + return write (fd, buf, num_bytes); +#endif + } + return 0; // Return 0 since errno won't be set if we didn't call write +} + |