diff options
author | emaste <emaste@FreeBSD.org> | 2014-11-26 16:48:12 +0000 |
---|---|---|
committer | emaste <emaste@FreeBSD.org> | 2014-11-26 16:48:12 +0000 |
commit | 0147dda7de9580d13778ecb4c9e92b83b7a63911 (patch) | |
tree | b16dc95f693ed59342b6141cd3fd9f59a6cd7e7e /contrib/llvm/tools/lldb/source/Host/common/Pipe.cpp | |
parent | bfd4c39c61ae9b29542625bb12b6f7f4b1f8c727 (diff) | |
parent | 01ee1789d6aa7294e5966a97f8d29387f6f81699 (diff) | |
download | FreeBSD-src-0147dda7de9580d13778ecb4c9e92b83b7a63911.zip FreeBSD-src-0147dda7de9580d13778ecb4c9e92b83b7a63911.tar.gz |
Update LLDB snapshot to upstream r216948 (git 50f7fe44)
This is approximately "LLDB 3.5" although with a little bit of skew,
and will go along with the Clang 3.5 import.
Sponsored by: DARPA, AFRL
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 +} + |