summaryrefslogtreecommitdiffstats
path: root/lldb/source/Host
diff options
context:
space:
mode:
authorLawrence D'Anna <lawrence_danna@apple.com>2019-10-03 04:31:46 +0000
committerLawrence D'Anna <lawrence_danna@apple.com>2019-10-03 04:31:46 +0000
commitf913fd6eb0c228041b77a645d76993760d3b1421 (patch)
tree9d33e1b8a85f1fbccf83cc3f59efeed7aa4511c3 /lldb/source/Host
parent96898eb6a935533aaebbfbd085150fbf705c0ffc (diff)
downloadbcm5719-llvm-f913fd6eb0c228041b77a645d76993760d3b1421.tar.gz
bcm5719-llvm-f913fd6eb0c228041b77a645d76993760d3b1421.zip
factor out an abstract base class for File
Summary: This patch factors out File as an abstract base class and moves most of its actual functionality into a subclass called NativeFile. In the next patch, I'm going to be adding subclasses of File that don't necessarily have any connection to actual OS files, so they will not inherit from NativeFile. This patch was split out as a prerequisite for https://reviews.llvm.org/D68188 Reviewers: JDevlieghere, jasonmolenda, labath Reviewed By: labath Subscribers: lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D68317 llvm-svn: 373564
Diffstat (limited to 'lldb/source/Host')
-rw-r--r--lldb/source/Host/common/File.cpp274
-rw-r--r--lldb/source/Host/common/FileSystem.cpp3
-rw-r--r--lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp12
3 files changed, 176 insertions, 113 deletions
diff --git a/lldb/source/Host/common/File.cpp b/lldb/source/Host/common/File.cpp
index eff4197db64..bd4cfcdb334 100644
--- a/lldb/source/Host/common/File.cpp
+++ b/lldb/source/Host/common/File.cpp
@@ -85,9 +85,152 @@ uint32_t File::GetOptionsFromMode(llvm::StringRef mode) {
int File::kInvalidDescriptor = -1;
FILE *File::kInvalidStream = nullptr;
-File::~File() { Close(); }
+Status File::Read(void *buf, size_t &num_bytes) {
+ return std::error_code(ENOTSUP, std::system_category());
+}
+Status File::Write(const void *buf, size_t &num_bytes) {
+ return std::error_code(ENOTSUP, std::system_category());
+}
+
+bool File::IsValid() const { return false; }
+
+Status File::Close() { return Flush(); }
+
+IOObject::WaitableHandle File::GetWaitableHandle() {
+ return IOObject::kInvalidHandleValue;
+}
+
+Status File::GetFileSpec(FileSpec &file_spec) const {
+ file_spec.Clear();
+ return std::error_code(ENOTSUP, std::system_category());
+}
+
+FILE *File::TakeStreamAndClear() { return nullptr; }
+
+int File::GetDescriptor() const { return kInvalidDescriptor; }
+
+FILE *File::GetStream() { return nullptr; }
+
+off_t File::SeekFromStart(off_t offset, Status *error_ptr) {
+ if (error_ptr)
+ *error_ptr = std::error_code(ENOTSUP, std::system_category());
+ return -1;
+}
+
+off_t File::SeekFromCurrent(off_t offset, Status *error_ptr) {
+ if (error_ptr)
+ *error_ptr = std::error_code(ENOTSUP, std::system_category());
+ return -1;
+}
+
+off_t File::SeekFromEnd(off_t offset, Status *error_ptr) {
+ if (error_ptr)
+ *error_ptr = std::error_code(ENOTSUP, std::system_category());
+ return -1;
+}
+
+Status File::Read(void *dst, size_t &num_bytes, off_t &offset) {
+ return std::error_code(ENOTSUP, std::system_category());
+}
+
+Status File::Write(const void *src, size_t &num_bytes, off_t &offset) {
+ return std::error_code(ENOTSUP, std::system_category());
+}
+
+Status File::Flush() { return Status(); }
+
+Status File::Sync() { return Flush(); }
+
+void File::CalculateInteractiveAndTerminal() {
+ const int fd = GetDescriptor();
+ if (!DescriptorIsValid(fd)) {
+ m_is_interactive = eLazyBoolNo;
+ m_is_real_terminal = eLazyBoolNo;
+ m_supports_colors = eLazyBoolNo;
+ return;
+ }
+ m_is_interactive = eLazyBoolNo;
+ m_is_real_terminal = eLazyBoolNo;
+#if defined(_WIN32)
+ if (_isatty(fd)) {
+ m_is_interactive = eLazyBoolYes;
+ m_is_real_terminal = eLazyBoolYes;
+#if defined(ENABLE_VIRTUAL_TERMINAL_PROCESSING)
+ m_supports_colors = eLazyBoolYes;
+#endif
+ }
+#else
+ if (isatty(fd)) {
+ m_is_interactive = eLazyBoolYes;
+ struct winsize window_size;
+ if (::ioctl(fd, TIOCGWINSZ, &window_size) == 0) {
+ if (window_size.ws_col > 0) {
+ m_is_real_terminal = eLazyBoolYes;
+ if (llvm::sys::Process::FileDescriptorHasColors(fd))
+ m_supports_colors = eLazyBoolYes;
+ }
+ }
+ }
+#endif
+}
+
+bool File::GetIsInteractive() {
+ if (m_is_interactive == eLazyBoolCalculate)
+ CalculateInteractiveAndTerminal();
+ return m_is_interactive == eLazyBoolYes;
+}
+
+bool File::GetIsRealTerminal() {
+ if (m_is_real_terminal == eLazyBoolCalculate)
+ CalculateInteractiveAndTerminal();
+ return m_is_real_terminal == eLazyBoolYes;
+}
+
+bool File::GetIsTerminalWithColors() {
+ if (m_supports_colors == eLazyBoolCalculate)
+ CalculateInteractiveAndTerminal();
+ return m_supports_colors == eLazyBoolYes;
+}
+
+size_t File::Printf(const char *format, ...) {
+ va_list args;
+ va_start(args, format);
+ size_t result = PrintfVarArg(format, args);
+ va_end(args);
+ return result;
+}
+
+size_t File::PrintfVarArg(const char *format, va_list args) {
+ size_t result = 0;
+ char *s = nullptr;
+ result = vasprintf(&s, format, args);
+ if (s != nullptr) {
+ if (result > 0) {
+ size_t s_len = result;
+ Write(s, s_len);
+ result = s_len;
+ }
+ free(s);
+ }
+ return result;
+}
+
+uint32_t File::GetPermissions(Status &error) const {
+ int fd = GetDescriptor();
+ if (!DescriptorIsValid(fd)) {
+ error = std::error_code(ENOTSUP, std::system_category());
+ return 0;
+ }
+ struct stat file_stats;
+ if (::fstat(fd, &file_stats) == -1) {
+ error.SetErrorToErrno();
+ return 0;
+ }
+ error.Clear();
+ return file_stats.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO);
+}
-int File::GetDescriptor() const {
+int NativeFile::GetDescriptor() const {
if (DescriptorIsValid())
return m_descriptor;
@@ -105,9 +248,11 @@ int File::GetDescriptor() const {
return kInvalidDescriptor;
}
-IOObject::WaitableHandle File::GetWaitableHandle() { return GetDescriptor(); }
+IOObject::WaitableHandle NativeFile::GetWaitableHandle() {
+ return GetDescriptor();
+}
-FILE *File::GetStream() {
+FILE *NativeFile::GetStream() {
if (!StreamIsValid()) {
if (DescriptorIsValid()) {
const char *mode = GetStreamOpenModeFromOptions(m_options);
@@ -139,23 +284,7 @@ FILE *File::GetStream() {
return m_stream;
}
-uint32_t File::GetPermissions(Status &error) const {
- int fd = GetDescriptor();
- if (fd != kInvalidDescriptor) {
- struct stat file_stats;
- if (::fstat(fd, &file_stats) == -1)
- error.SetErrorToErrno();
- else {
- error.Clear();
- return file_stats.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO);
- }
- } else {
- error.SetErrorString("invalid file descriptor");
- }
- return 0;
-}
-
-Status File::Close() {
+Status NativeFile::Close() {
Status error;
if (StreamIsValid()) {
if (m_own_stream) {
@@ -166,7 +295,6 @@ Status File::Close() {
error.SetErrorToErrno();
}
}
-
if (DescriptorIsValid() && m_own_descriptor) {
if (::close(m_descriptor) != 0)
error.SetErrorToErrno();
@@ -181,7 +309,7 @@ Status File::Close() {
return error;
}
-FILE *File::TakeStreamAndClear() {
+FILE *NativeFile::TakeStreamAndClear() {
FILE *stream = GetStream();
m_stream = NULL;
m_descriptor = kInvalidDescriptor;
@@ -193,7 +321,7 @@ FILE *File::TakeStreamAndClear() {
return stream;
}
-Status File::GetFileSpec(FileSpec &file_spec) const {
+Status NativeFile::GetFileSpec(FileSpec &file_spec) const {
Status error;
#ifdef F_GETPATH
if (IsValid()) {
@@ -220,7 +348,8 @@ Status File::GetFileSpec(FileSpec &file_spec) const {
}
}
#else
- error.SetErrorString("File::GetFileSpec is not supported on this platform");
+ error.SetErrorString(
+ "NativeFile::GetFileSpec is not supported on this platform");
#endif
if (error.Fail())
@@ -228,7 +357,7 @@ Status File::GetFileSpec(FileSpec &file_spec) const {
return error;
}
-off_t File::SeekFromStart(off_t offset, Status *error_ptr) {
+off_t NativeFile::SeekFromStart(off_t offset, Status *error_ptr) {
off_t result = 0;
if (DescriptorIsValid()) {
result = ::lseek(m_descriptor, offset, SEEK_SET);
@@ -254,7 +383,7 @@ off_t File::SeekFromStart(off_t offset, Status *error_ptr) {
return result;
}
-off_t File::SeekFromCurrent(off_t offset, Status *error_ptr) {
+off_t NativeFile::SeekFromCurrent(off_t offset, Status *error_ptr) {
off_t result = -1;
if (DescriptorIsValid()) {
result = ::lseek(m_descriptor, offset, SEEK_CUR);
@@ -280,7 +409,7 @@ off_t File::SeekFromCurrent(off_t offset, Status *error_ptr) {
return result;
}
-off_t File::SeekFromEnd(off_t offset, Status *error_ptr) {
+off_t NativeFile::SeekFromEnd(off_t offset, Status *error_ptr) {
off_t result = -1;
if (DescriptorIsValid()) {
result = ::lseek(m_descriptor, offset, SEEK_END);
@@ -306,7 +435,7 @@ off_t File::SeekFromEnd(off_t offset, Status *error_ptr) {
return result;
}
-Status File::Flush() {
+Status NativeFile::Flush() {
Status error;
if (StreamIsValid()) {
if (llvm::sys::RetryAfterSignal(EOF, ::fflush, m_stream) == EOF)
@@ -317,7 +446,7 @@ Status File::Flush() {
return error;
}
-Status File::Sync() {
+Status NativeFile::Sync() {
Status error;
if (DescriptorIsValid()) {
#ifdef _WIN32
@@ -340,7 +469,7 @@ Status File::Sync() {
#define MAX_WRITE_SIZE INT_MAX
#endif
-Status File::Read(void *buf, size_t &num_bytes) {
+Status NativeFile::Read(void *buf, size_t &num_bytes) {
Status error;
#if defined(MAX_READ_SIZE)
@@ -399,7 +528,7 @@ Status File::Read(void *buf, size_t &num_bytes) {
return error;
}
-Status File::Write(const void *buf, size_t &num_bytes) {
+Status NativeFile::Write(const void *buf, size_t &num_bytes) {
Status error;
#if defined(MAX_WRITE_SIZE)
@@ -461,7 +590,7 @@ Status File::Write(const void *buf, size_t &num_bytes) {
return error;
}
-Status File::Read(void *buf, size_t &num_bytes, off_t &offset) {
+Status NativeFile::Read(void *buf, size_t &num_bytes, off_t &offset) {
Status error;
#if defined(MAX_READ_SIZE)
@@ -521,7 +650,7 @@ Status File::Read(void *buf, size_t &num_bytes, off_t &offset) {
return error;
}
-Status File::Write(const void *buf, size_t &num_bytes, off_t &offset) {
+Status NativeFile::Write(const void *buf, size_t &num_bytes, off_t &offset) {
Status error;
#if defined(MAX_WRITE_SIZE)
@@ -585,33 +714,12 @@ Status File::Write(const void *buf, size_t &num_bytes, off_t &offset) {
return error;
}
-// Print some formatted output to the stream.
-size_t File::Printf(const char *format, ...) {
- va_list args;
- va_start(args, format);
- size_t result = PrintfVarArg(format, args);
- va_end(args);
- return result;
-}
-
-// Print some formatted output to the stream.
-size_t File::PrintfVarArg(const char *format, va_list args) {
- size_t result = 0;
- if (DescriptorIsValid()) {
- char *s = nullptr;
- result = vasprintf(&s, format, args);
- if (s != nullptr) {
- if (result > 0) {
- size_t s_len = result;
- Write(s, s_len);
- result = s_len;
- }
- free(s);
- }
- } else if (StreamIsValid()) {
- result = ::vfprintf(m_stream, format, args);
+size_t NativeFile::PrintfVarArg(const char *format, va_list args) {
+ if (StreamIsValid()) {
+ return ::vfprintf(m_stream, format, args);
+ } else {
+ return File::PrintfVarArg(format, args);
}
- return result;
}
mode_t File::ConvertOpenOptionsForPOSIXOpen(uint32_t open_options) {
@@ -638,49 +746,3 @@ mode_t File::ConvertOpenOptionsForPOSIXOpen(uint32_t open_options) {
return mode;
}
-void File::CalculateInteractiveAndTerminal() {
- const int fd = GetDescriptor();
- if (fd >= 0) {
- m_is_interactive = eLazyBoolNo;
- m_is_real_terminal = eLazyBoolNo;
-#if defined(_WIN32)
- if (_isatty(fd)) {
- m_is_interactive = eLazyBoolYes;
- m_is_real_terminal = eLazyBoolYes;
-#if defined(ENABLE_VIRTUAL_TERMINAL_PROCESSING)
- m_supports_colors = eLazyBoolYes;
-#endif
- }
-#else
- if (isatty(fd)) {
- m_is_interactive = eLazyBoolYes;
- struct winsize window_size;
- if (::ioctl(fd, TIOCGWINSZ, &window_size) == 0) {
- if (window_size.ws_col > 0) {
- m_is_real_terminal = eLazyBoolYes;
- if (llvm::sys::Process::FileDescriptorHasColors(fd))
- m_supports_colors = eLazyBoolYes;
- }
- }
- }
-#endif
- }
-}
-
-bool File::GetIsInteractive() {
- if (m_is_interactive == eLazyBoolCalculate)
- CalculateInteractiveAndTerminal();
- return m_is_interactive == eLazyBoolYes;
-}
-
-bool File::GetIsRealTerminal() {
- if (m_is_real_terminal == eLazyBoolCalculate)
- CalculateInteractiveAndTerminal();
- return m_is_real_terminal == eLazyBoolYes;
-}
-
-bool File::GetIsTerminalWithColors() {
- if (m_supports_colors == eLazyBoolCalculate)
- CalculateInteractiveAndTerminal();
- return m_supports_colors == eLazyBoolYes;
-}
diff --git a/lldb/source/Host/common/FileSystem.cpp b/lldb/source/Host/common/FileSystem.cpp
index b3442770f01..ba581ae4168 100644
--- a/lldb/source/Host/common/FileSystem.cpp
+++ b/lldb/source/Host/common/FileSystem.cpp
@@ -435,7 +435,8 @@ Expected<FileUP> FileSystem::Open(const FileSpec &file_spec, uint32_t options,
return llvm::errorCodeToError(
std::error_code(errno, std::system_category()));
- auto file = std::make_unique<File>(descriptor, options, should_close_fd);
+ auto file = std::unique_ptr<File>(
+ new NativeFile(descriptor, options, should_close_fd));
assert(file->IsValid());
return std::move(file);
}
diff --git a/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp b/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp
index f9759ec3caf..325d854921e 100644
--- a/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp
+++ b/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp
@@ -86,8 +86,8 @@ ConnectionFileDescriptor::ConnectionFileDescriptor(bool child_processes_inherit)
ConnectionFileDescriptor::ConnectionFileDescriptor(int fd, bool owns_fd)
: Connection(), m_pipe(), m_mutex(), m_shutting_down(false),
m_waiting_for_accept(false), m_child_processes_inherit(false) {
- m_write_sp = std::make_shared<File>(fd, File::eOpenOptionWrite, owns_fd);
- m_read_sp = std::make_shared<File>(fd, File::eOpenOptionRead, false);
+ m_write_sp = std::make_shared<NativeFile>(fd, File::eOpenOptionWrite, owns_fd);
+ m_read_sp = std::make_shared<NativeFile>(fd, File::eOpenOptionRead, false);
Log *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_CONNECTION |
LIBLLDB_LOG_OBJECT));
@@ -219,9 +219,9 @@ ConnectionStatus ConnectionFileDescriptor::Connect(llvm::StringRef path,
m_write_sp = m_read_sp;
} else {
m_read_sp =
- std::make_shared<File>(fd, File::eOpenOptionRead, false);
+ std::make_shared<NativeFile>(fd, File::eOpenOptionRead, false);
m_write_sp =
- std::make_shared<File>(fd, File::eOpenOptionWrite, false);
+ std::make_shared<NativeFile>(fd, File::eOpenOptionWrite, false);
}
m_uri = *addr;
return eConnectionStatusSuccess;
@@ -270,8 +270,8 @@ ConnectionStatus ConnectionFileDescriptor::Connect(llvm::StringRef path,
::fcntl(fd, F_SETFL, flags);
}
}
- m_read_sp = std::make_shared<File>(fd, File::eOpenOptionRead, true);
- m_write_sp = std::make_shared<File>(fd, File::eOpenOptionWrite, false);
+ m_read_sp = std::make_shared<NativeFile>(fd, File::eOpenOptionRead, true);
+ m_write_sp = std::make_shared<NativeFile>(fd, File::eOpenOptionWrite, false);
return eConnectionStatusSuccess;
}
#endif
OpenPOWER on IntegriCloud