1 //===-- FileCache.cpp -----------------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 #include "lldb/Host/FileCache.h"
11 #include "lldb/Host/File.h"
12 #include "lldb/Host/FileSystem.h"
15 using namespace lldb_private
;
17 FileCache
*FileCache::m_instance
= nullptr;
19 FileCache
&FileCache::GetInstance() {
20 if (m_instance
== nullptr)
21 m_instance
= new FileCache();
26 lldb::user_id_t
FileCache::OpenFile(const FileSpec
&file_spec
,
27 File::OpenOptions flags
, uint32_t mode
,
30 error
= Status::FromErrorString("empty path");
33 auto file
= FileSystem::Instance().Open(file_spec
, flags
, mode
);
35 error
= Status::FromError(file
.takeError());
38 lldb::user_id_t fd
= file
.get()->GetDescriptor();
39 m_cache
[fd
] = std::move(file
.get());
43 bool FileCache::CloseFile(lldb::user_id_t fd
, Status
&error
) {
44 if (fd
== UINT64_MAX
) {
45 error
= Status::FromErrorString("invalid file descriptor");
48 FDToFileMap::iterator pos
= m_cache
.find(fd
);
49 if (pos
== m_cache
.end()) {
50 error
= Status::FromErrorStringWithFormat(
51 "invalid host file descriptor %" PRIu64
, fd
);
54 FileUP
&file_up
= pos
->second
;
56 error
= Status::FromErrorString("invalid host backing file");
59 error
= file_up
->Close();
61 return error
.Success();
64 uint64_t FileCache::WriteFile(lldb::user_id_t fd
, uint64_t offset
,
65 const void *src
, uint64_t src_len
,
67 if (fd
== UINT64_MAX
) {
68 error
= Status::FromErrorString("invalid file descriptor");
71 FDToFileMap::iterator pos
= m_cache
.find(fd
);
72 if (pos
== m_cache
.end()) {
73 error
= Status::FromErrorStringWithFormat(
74 "invalid host file descriptor %" PRIu64
, fd
);
77 FileUP
&file_up
= pos
->second
;
79 error
= Status::FromErrorString("invalid host backing file");
82 if (static_cast<uint64_t>(file_up
->SeekFromStart(offset
, &error
)) != offset
||
85 size_t bytes_written
= src_len
;
86 error
= file_up
->Write(src
, bytes_written
);
92 uint64_t FileCache::ReadFile(lldb::user_id_t fd
, uint64_t offset
, void *dst
,
93 uint64_t dst_len
, Status
&error
) {
94 if (fd
== UINT64_MAX
) {
95 error
= Status::FromErrorString("invalid file descriptor");
98 FDToFileMap::iterator pos
= m_cache
.find(fd
);
99 if (pos
== m_cache
.end()) {
100 error
= Status::FromErrorStringWithFormat(
101 "invalid host file descriptor %" PRIu64
, fd
);
104 FileUP
&file_up
= pos
->second
;
106 error
= Status::FromErrorString("invalid host backing file");
109 if (static_cast<uint64_t>(file_up
->SeekFromStart(offset
, &error
)) != offset
||
112 size_t bytes_read
= dst_len
;
113 error
= file_up
->Read(dst
, bytes_read
);