forked from OSchip/llvm-project
172 lines
3.0 KiB
C++
172 lines
3.0 KiB
C++
//===-- 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
|
|
}
|
|
|