LLDB mainline
FileCache.cpp
Go to the documentation of this file.
1//===-- FileCache.cpp -----------------------------------------------------===//
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
10
11#include "lldb/Host/File.h"
13
14#include <cerrno>
15
16using namespace lldb;
17using namespace lldb_private;
18
20
22 if (m_instance == nullptr)
23 m_instance = new FileCache();
24
25 return *m_instance;
26}
27
29 File::OpenOptions flags, uint32_t mode,
30 Status &error) {
31 if (!file_spec) {
32 error = Status::FromErrorString("empty path");
33 return UINT64_MAX;
34 }
35 auto file = FileSystem::Instance().Open(file_spec, flags, mode);
36 if (!file) {
37 error = Status::FromError(file.takeError());
38 return UINT64_MAX;
39 }
40 lldb::user_id_t fd = file.get()->GetDescriptor();
41 m_cache[fd] = std::move(file.get());
42 return fd;
43}
44
46 if (fd == UINT64_MAX) {
47 error = Status::FromErrorString("invalid file descriptor");
48 return false;
49 }
50 FDToFileMap::iterator pos = m_cache.find(fd);
51 if (pos == m_cache.end()) {
53 "invalid host file descriptor %" PRIu64, fd);
54 return false;
55 }
56 FileUP &file_up = pos->second;
57 if (!file_up) {
58 error = Status::FromErrorString("invalid host backing file");
59 return false;
60 }
61 error = file_up->Close();
62 m_cache.erase(pos);
63 return error.Success();
64}
65
66uint64_t FileCache::WriteFile(lldb::user_id_t fd, uint64_t offset,
67 const void *src, uint64_t src_len,
68 Status &error) {
69 if (fd == UINT64_MAX) {
70 error = Status::FromErrorString("invalid file descriptor");
71 return UINT64_MAX;
72 }
73 FDToFileMap::iterator pos = m_cache.find(fd);
74 if (pos == m_cache.end()) {
76 "invalid host file descriptor %" PRIu64, fd);
77 return UINT64_MAX;
78 }
79 FileUP &file_up = pos->second;
80 if (!file_up) {
81 error = Status::FromErrorString("invalid host backing file");
82 return UINT64_MAX;
83 }
84 if (static_cast<uint64_t>(file_up->SeekFromStart(offset, &error)) != offset ||
85 error.Fail()) {
86 // A pipe cannot seek, so the seek fails on it with ESPIPE. The offset
87 // means nothing there, so write at the pipe's end instead.
88 if (error.GetError() != ESPIPE)
89 return UINT64_MAX;
90 error.Clear();
91 }
92 size_t bytes_written = src_len;
93 error = file_up->Write(src, bytes_written);
94 if (error.Fail())
95 return UINT64_MAX;
96 return bytes_written;
97}
98
99uint64_t FileCache::ReadFile(lldb::user_id_t fd, uint64_t offset, void *dst,
100 uint64_t dst_len, Status &error) {
101 if (fd == UINT64_MAX) {
102 error = Status::FromErrorString("invalid file descriptor");
103 return UINT64_MAX;
104 }
105 FDToFileMap::iterator pos = m_cache.find(fd);
106 if (pos == m_cache.end()) {
108 "invalid host file descriptor %" PRIu64, fd);
109 return UINT64_MAX;
110 }
111 FileUP &file_up = pos->second;
112 if (!file_up) {
113 error = Status::FromErrorString("invalid host backing file");
114 return UINT64_MAX;
115 }
116 if (static_cast<uint64_t>(file_up->SeekFromStart(offset, &error)) != offset ||
117 error.Fail())
118 return UINT64_MAX;
119 size_t bytes_read = dst_len;
120 error = file_up->Read(dst, bytes_read);
121 if (error.Fail())
122 return UINT64_MAX;
123 return bytes_read;
124}
static llvm::raw_ostream & error(Stream &strm)
bool CloseFile(lldb::user_id_t fd, Status &error)
Definition FileCache.cpp:45
uint64_t ReadFile(lldb::user_id_t fd, uint64_t offset, void *dst, uint64_t dst_len, Status &error)
Definition FileCache.cpp:99
lldb::user_id_t OpenFile(const FileSpec &file_spec, File::OpenOptions flags, uint32_t mode, Status &error)
Definition FileCache.cpp:28
uint64_t WriteFile(lldb::user_id_t fd, uint64_t offset, const void *src, uint64_t src_len, Status &error)
Definition FileCache.cpp:66
static FileCache * m_instance
Definition FileCache.h:41
static FileCache & GetInstance()
Definition FileCache.cpp:21
A file utility class.
Definition FileSpec.h:56
int Open(const char *path, int flags, int mode=0600)
Wraps open in a platform-independent way.
static FileSystem & Instance()
An error handling class.
Definition Status.h:118
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
Definition Status.cpp:106
static Status FromErrorString(const char *str)
Definition Status.h:141
static Status FromError(llvm::Error error)
Avoid using this in new code. Migrate APIs to llvm::Expected instead.
Definition Status.cpp:136
#define UINT64_MAX
A class that represents a running process on the host machine.
std::unique_ptr< lldb_private::File > FileUP
uint64_t user_id_t
Definition lldb-types.h:83