1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/posix/global_descriptors.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <vector>
8*6777b538SAndroid Build Coastguard Worker #include <utility>
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker #include "base/logging.h"
11*6777b538SAndroid Build Coastguard Worker
12*6777b538SAndroid Build Coastguard Worker namespace base {
13*6777b538SAndroid Build Coastguard Worker
Descriptor(Key key,int fd)14*6777b538SAndroid Build Coastguard Worker GlobalDescriptors::Descriptor::Descriptor(Key key, int fd)
15*6777b538SAndroid Build Coastguard Worker : key(key), fd(fd), region(base::MemoryMappedFile::Region::kWholeFile) {
16*6777b538SAndroid Build Coastguard Worker }
17*6777b538SAndroid Build Coastguard Worker
Descriptor(Key key,int fd,base::MemoryMappedFile::Region region)18*6777b538SAndroid Build Coastguard Worker GlobalDescriptors::Descriptor::Descriptor(Key key,
19*6777b538SAndroid Build Coastguard Worker int fd,
20*6777b538SAndroid Build Coastguard Worker base::MemoryMappedFile::Region region)
21*6777b538SAndroid Build Coastguard Worker : key(key), fd(fd), region(region) {
22*6777b538SAndroid Build Coastguard Worker }
23*6777b538SAndroid Build Coastguard Worker
24*6777b538SAndroid Build Coastguard Worker // static
GetInstance()25*6777b538SAndroid Build Coastguard Worker GlobalDescriptors* GlobalDescriptors::GetInstance() {
26*6777b538SAndroid Build Coastguard Worker typedef Singleton<base::GlobalDescriptors,
27*6777b538SAndroid Build Coastguard Worker LeakySingletonTraits<base::GlobalDescriptors> >
28*6777b538SAndroid Build Coastguard Worker GlobalDescriptorsSingleton;
29*6777b538SAndroid Build Coastguard Worker return GlobalDescriptorsSingleton::get();
30*6777b538SAndroid Build Coastguard Worker }
31*6777b538SAndroid Build Coastguard Worker
Get(Key key) const32*6777b538SAndroid Build Coastguard Worker int GlobalDescriptors::Get(Key key) const {
33*6777b538SAndroid Build Coastguard Worker const int ret = MaybeGet(key);
34*6777b538SAndroid Build Coastguard Worker
35*6777b538SAndroid Build Coastguard Worker if (ret == -1)
36*6777b538SAndroid Build Coastguard Worker DLOG(FATAL) << "Unknown global descriptor: " << key;
37*6777b538SAndroid Build Coastguard Worker return ret;
38*6777b538SAndroid Build Coastguard Worker }
39*6777b538SAndroid Build Coastguard Worker
MaybeGet(Key key) const40*6777b538SAndroid Build Coastguard Worker int GlobalDescriptors::MaybeGet(Key key) const {
41*6777b538SAndroid Build Coastguard Worker for (const auto& i : descriptors_) {
42*6777b538SAndroid Build Coastguard Worker if (i.key == key)
43*6777b538SAndroid Build Coastguard Worker return i.fd;
44*6777b538SAndroid Build Coastguard Worker }
45*6777b538SAndroid Build Coastguard Worker
46*6777b538SAndroid Build Coastguard Worker return -1;
47*6777b538SAndroid Build Coastguard Worker }
48*6777b538SAndroid Build Coastguard Worker
TakeFD(Key key,base::MemoryMappedFile::Region * region)49*6777b538SAndroid Build Coastguard Worker base::ScopedFD GlobalDescriptors::TakeFD(
50*6777b538SAndroid Build Coastguard Worker Key key,
51*6777b538SAndroid Build Coastguard Worker base::MemoryMappedFile::Region* region) {
52*6777b538SAndroid Build Coastguard Worker base::ScopedFD fd;
53*6777b538SAndroid Build Coastguard Worker for (auto i = descriptors_.begin(); i != descriptors_.end(); ++i) {
54*6777b538SAndroid Build Coastguard Worker if (i->key == key) {
55*6777b538SAndroid Build Coastguard Worker *region = i->region;
56*6777b538SAndroid Build Coastguard Worker fd.reset(i->fd);
57*6777b538SAndroid Build Coastguard Worker descriptors_.erase(i);
58*6777b538SAndroid Build Coastguard Worker break;
59*6777b538SAndroid Build Coastguard Worker }
60*6777b538SAndroid Build Coastguard Worker }
61*6777b538SAndroid Build Coastguard Worker return fd;
62*6777b538SAndroid Build Coastguard Worker }
63*6777b538SAndroid Build Coastguard Worker
Set(Key key,int fd)64*6777b538SAndroid Build Coastguard Worker void GlobalDescriptors::Set(Key key, int fd) {
65*6777b538SAndroid Build Coastguard Worker Set(key, fd, base::MemoryMappedFile::Region::kWholeFile);
66*6777b538SAndroid Build Coastguard Worker }
67*6777b538SAndroid Build Coastguard Worker
Set(Key key,int fd,base::MemoryMappedFile::Region region)68*6777b538SAndroid Build Coastguard Worker void GlobalDescriptors::Set(Key key,
69*6777b538SAndroid Build Coastguard Worker int fd,
70*6777b538SAndroid Build Coastguard Worker base::MemoryMappedFile::Region region) {
71*6777b538SAndroid Build Coastguard Worker for (auto& i : descriptors_) {
72*6777b538SAndroid Build Coastguard Worker if (i.key == key) {
73*6777b538SAndroid Build Coastguard Worker i.fd = fd;
74*6777b538SAndroid Build Coastguard Worker i.region = region;
75*6777b538SAndroid Build Coastguard Worker return;
76*6777b538SAndroid Build Coastguard Worker }
77*6777b538SAndroid Build Coastguard Worker }
78*6777b538SAndroid Build Coastguard Worker
79*6777b538SAndroid Build Coastguard Worker descriptors_.push_back(Descriptor(key, fd, region));
80*6777b538SAndroid Build Coastguard Worker }
81*6777b538SAndroid Build Coastguard Worker
GetRegion(Key key) const82*6777b538SAndroid Build Coastguard Worker base::MemoryMappedFile::Region GlobalDescriptors::GetRegion(Key key) const {
83*6777b538SAndroid Build Coastguard Worker for (const auto& i : descriptors_) {
84*6777b538SAndroid Build Coastguard Worker if (i.key == key)
85*6777b538SAndroid Build Coastguard Worker return i.region;
86*6777b538SAndroid Build Coastguard Worker }
87*6777b538SAndroid Build Coastguard Worker DLOG(FATAL) << "Unknown global descriptor: " << key;
88*6777b538SAndroid Build Coastguard Worker return base::MemoryMappedFile::Region::kWholeFile;
89*6777b538SAndroid Build Coastguard Worker }
90*6777b538SAndroid Build Coastguard Worker
Reset(const Mapping & mapping)91*6777b538SAndroid Build Coastguard Worker void GlobalDescriptors::Reset(const Mapping& mapping) {
92*6777b538SAndroid Build Coastguard Worker descriptors_ = mapping;
93*6777b538SAndroid Build Coastguard Worker }
94*6777b538SAndroid Build Coastguard Worker
95*6777b538SAndroid Build Coastguard Worker GlobalDescriptors::GlobalDescriptors() = default;
96*6777b538SAndroid Build Coastguard Worker
97*6777b538SAndroid Build Coastguard Worker GlobalDescriptors::~GlobalDescriptors() = default;
98*6777b538SAndroid Build Coastguard Worker
99*6777b538SAndroid Build Coastguard Worker } // namespace base
100