1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
content / browser / posix_file_descriptor_info_impl.cc [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/posix_file_descriptor_info_impl.h"
#include <utility>
#include "base/containers/contains.h"
#include "base/ranges/algorithm.h"
namespace content {
// static
std::unique_ptr<PosixFileDescriptorInfo> PosixFileDescriptorInfoImpl::Create() {
return std::unique_ptr<PosixFileDescriptorInfo>(
new PosixFileDescriptorInfoImpl());
}
PosixFileDescriptorInfoImpl::PosixFileDescriptorInfoImpl() {}
PosixFileDescriptorInfoImpl::~PosixFileDescriptorInfoImpl() {}
void PosixFileDescriptorInfoImpl::Share(int id, base::PlatformFile fd) {
ShareWithRegion(id, fd, base::MemoryMappedFile::Region::kWholeFile);
}
void PosixFileDescriptorInfoImpl::ShareWithRegion(
int id,
base::PlatformFile fd,
const base::MemoryMappedFile::Region& region) {
AddToMapping(id, fd, region);
}
void PosixFileDescriptorInfoImpl::Transfer(int id, base::ScopedFD fd) {
AddToMapping(id, fd.get(), base::MemoryMappedFile::Region::kWholeFile);
owned_descriptors_.push_back(std::move(fd));
}
base::PlatformFile PosixFileDescriptorInfoImpl::GetFDAt(size_t i) {
return mapping_[i].first;
}
int PosixFileDescriptorInfoImpl::GetIDAt(size_t i) {
return mapping_[i].second;
}
const base::MemoryMappedFile::Region& PosixFileDescriptorInfoImpl::GetRegionAt(
size_t i) {
auto iter = ids_to_regions_.find(GetIDAt(i));
return (iter != ids_to_regions_.end())
? iter->second
: base::MemoryMappedFile::Region::kWholeFile;
}
size_t PosixFileDescriptorInfoImpl::GetMappingSize() {
return mapping_.size();
}
bool PosixFileDescriptorInfoImpl::HasID(int id) const {
for (unsigned i = 0; i < mapping_.size(); ++i) {
if (mapping_[i].second == id)
return true;
}
return false;
}
bool PosixFileDescriptorInfoImpl::OwnsFD(base::PlatformFile file) {
return base::Contains(owned_descriptors_, file);
}
base::ScopedFD PosixFileDescriptorInfoImpl::ReleaseFD(base::PlatformFile file) {
auto found = base::ranges::find(owned_descriptors_, file);
CHECK(found != owned_descriptors_.end(), base::NotFatalUntil::M131);
base::ScopedFD fd;
std::swap(*found, fd);
owned_descriptors_.erase(found);
return fd;
}
void PosixFileDescriptorInfoImpl::AddToMapping(
int id,
base::PlatformFile fd,
const base::MemoryMappedFile::Region& region) {
DCHECK(!HasID(id));
mapping_.push_back(std::make_pair(fd, id));
if (region != base::MemoryMappedFile::Region::kWholeFile)
ids_to_regions_[id] = region;
}
const base::FileHandleMappingVector& PosixFileDescriptorInfoImpl::GetMapping() {
return mapping_;
}
base::FileHandleMappingVector
PosixFileDescriptorInfoImpl::GetMappingWithIDAdjustment(int delta) {
base::FileHandleMappingVector result(mapping_);
// Adding delta to each ID.
for (size_t i = 0; i < result.size(); ++i)
result[i].second += delta;
return result;
}
} // namespace content