xref: /aosp_15_r20/external/cronet/base/posix/global_descriptors.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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