blob: 738d14e3ad543f21ca1fa098e3d1c4fd029f054b [file] [log] [blame]
jcivelli@chromium.orgc30c76f2012-06-27 10:12:24 +09001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
agl@chromium.org28a12e72009-06-13 02:36:55 +09002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
brettw@chromium.orgea3b3f22012-11-10 08:46:54 +09005#include "base/posix/global_descriptors.h"
agl@chromium.org28a12e72009-06-13 02:36:55 +09006
7#include <vector>
8#include <utility>
9
10#include "base/logging.h"
11
12namespace base {
13
mkosiba7fcbf662015-01-09 22:10:22 +090014GlobalDescriptors::Descriptor::Descriptor(Key key, int fd)
15 : key(key), fd(fd), region(base::MemoryMappedFile::Region::kWholeFile) {
16}
17
18GlobalDescriptors::Descriptor::Descriptor(Key key,
19 int fd,
20 base::MemoryMappedFile::Region region)
21 : key(key), fd(fd), region(region) {
22}
23
evan@chromium.org77f95862010-12-08 06:26:47 +090024// static
25GlobalDescriptors* GlobalDescriptors::GetInstance() {
26 typedef Singleton<base::GlobalDescriptors,
27 LeakySingletonTraits<base::GlobalDescriptors> >
28 GlobalDescriptorsSingleton;
29 return GlobalDescriptorsSingleton::get();
30}
31
erg@google.com37c078e2011-01-11 09:50:59 +090032int GlobalDescriptors::Get(Key key) const {
33 const int ret = MaybeGet(key);
34
35 if (ret == -1)
Sigurdur Asgeirsson59235e62017-09-26 05:02:09 +090036 DLOG(DCHECK) << "Unknown global descriptor: " << key;
erg@google.com37c078e2011-01-11 09:50:59 +090037 return ret;
38}
39
agl@chromium.org28a12e72009-06-13 02:36:55 +090040int GlobalDescriptors::MaybeGet(Key key) const {
41 for (Mapping::const_iterator
42 i = descriptors_.begin(); i != descriptors_.end(); ++i) {
mkosiba7fcbf662015-01-09 22:10:22 +090043 if (i->key == key)
44 return i->fd;
agl@chromium.org28a12e72009-06-13 02:36:55 +090045 }
46
jcivelli@chromium.orgc30c76f2012-06-27 10:12:24 +090047 return -1;
agl@chromium.org28a12e72009-06-13 02:36:55 +090048}
49
jcivellid7470ef2017-02-17 03:38:59 +090050base::ScopedFD GlobalDescriptors::TakeFD(
51 Key key,
52 base::MemoryMappedFile::Region* region) {
53 base::ScopedFD fd;
54 for (Mapping::iterator i = descriptors_.begin(); i != descriptors_.end();
55 ++i) {
56 if (i->key == key) {
57 *region = i->region;
58 fd.reset(i->fd);
59 descriptors_.erase(i);
60 break;
61 }
62 }
63 return fd;
64}
65
agl@chromium.org28a12e72009-06-13 02:36:55 +090066void GlobalDescriptors::Set(Key key, int fd) {
mkosiba7fcbf662015-01-09 22:10:22 +090067 Set(key, fd, base::MemoryMappedFile::Region::kWholeFile);
68}
69
70void GlobalDescriptors::Set(Key key,
71 int fd,
72 base::MemoryMappedFile::Region region) {
73 for (auto& i : descriptors_) {
74 if (i.key == key) {
75 i.fd = fd;
76 i.region = region;
agl@chromium.org28a12e72009-06-13 02:36:55 +090077 return;
78 }
79 }
80
mkosiba7fcbf662015-01-09 22:10:22 +090081 descriptors_.push_back(Descriptor(key, fd, region));
82}
83
84base::MemoryMappedFile::Region GlobalDescriptors::GetRegion(Key key) const {
85 for (const auto& i : descriptors_) {
86 if (i.key == key)
87 return i.region;
88 }
Sigurdur Asgeirsson59235e62017-09-26 05:02:09 +090089 DLOG(DCHECK) << "Unknown global descriptor: " << key;
mkosiba7fcbf662015-01-09 22:10:22 +090090 return base::MemoryMappedFile::Region::kWholeFile;
agl@chromium.org28a12e72009-06-13 02:36:55 +090091}
92
erg@google.com37c078e2011-01-11 09:50:59 +090093void GlobalDescriptors::Reset(const Mapping& mapping) {
94 descriptors_ = mapping;
95}
96
Chris Watkinsd155d9f2017-11-29 16:16:38 +090097GlobalDescriptors::GlobalDescriptors() = default;
erg@google.com37c078e2011-01-11 09:50:59 +090098
Chris Watkinsd155d9f2017-11-29 16:16:38 +090099GlobalDescriptors::~GlobalDescriptors() = default;
erg@google.com37c078e2011-01-11 09:50:59 +0900100
agl@chromium.org28a12e72009-06-13 02:36:55 +0900101} // namespace base