|  | // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "base/posix/global_descriptors.h" | 
|  |  | 
|  | #include <vector> | 
|  | #include <utility> | 
|  |  | 
|  | #include "base/logging.h" | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | GlobalDescriptors::Descriptor::Descriptor(Key key, int fd) | 
|  | : key(key), fd(fd), region(base::MemoryMappedFile::Region::kWholeFile) { | 
|  | } | 
|  |  | 
|  | GlobalDescriptors::Descriptor::Descriptor(Key key, | 
|  | int fd, | 
|  | base::MemoryMappedFile::Region region) | 
|  | : key(key), fd(fd), region(region) { | 
|  | } | 
|  |  | 
|  | // static | 
|  | GlobalDescriptors* GlobalDescriptors::GetInstance() { | 
|  | typedef Singleton<base::GlobalDescriptors, | 
|  | LeakySingletonTraits<base::GlobalDescriptors> > | 
|  | GlobalDescriptorsSingleton; | 
|  | return GlobalDescriptorsSingleton::get(); | 
|  | } | 
|  |  | 
|  | int GlobalDescriptors::Get(Key key) const { | 
|  | const int ret = MaybeGet(key); | 
|  |  | 
|  | if (ret == -1) | 
|  | DLOG(DCHECK) << "Unknown global descriptor: " << key; | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | int GlobalDescriptors::MaybeGet(Key key) const { | 
|  | for (Mapping::const_iterator | 
|  | i = descriptors_.begin(); i != descriptors_.end(); ++i) { | 
|  | if (i->key == key) | 
|  | return i->fd; | 
|  | } | 
|  |  | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | base::ScopedFD GlobalDescriptors::TakeFD( | 
|  | Key key, | 
|  | base::MemoryMappedFile::Region* region) { | 
|  | base::ScopedFD fd; | 
|  | for (Mapping::iterator i = descriptors_.begin(); i != descriptors_.end(); | 
|  | ++i) { | 
|  | if (i->key == key) { | 
|  | *region = i->region; | 
|  | fd.reset(i->fd); | 
|  | descriptors_.erase(i); | 
|  | break; | 
|  | } | 
|  | } | 
|  | return fd; | 
|  | } | 
|  |  | 
|  | void GlobalDescriptors::Set(Key key, int fd) { | 
|  | Set(key, fd, base::MemoryMappedFile::Region::kWholeFile); | 
|  | } | 
|  |  | 
|  | void GlobalDescriptors::Set(Key key, | 
|  | int fd, | 
|  | base::MemoryMappedFile::Region region) { | 
|  | for (auto& i : descriptors_) { | 
|  | if (i.key == key) { | 
|  | i.fd = fd; | 
|  | i.region = region; | 
|  | return; | 
|  | } | 
|  | } | 
|  |  | 
|  | descriptors_.push_back(Descriptor(key, fd, region)); | 
|  | } | 
|  |  | 
|  | base::MemoryMappedFile::Region GlobalDescriptors::GetRegion(Key key) const { | 
|  | for (const auto& i : descriptors_) { | 
|  | if (i.key == key) | 
|  | return i.region; | 
|  | } | 
|  | DLOG(DCHECK) << "Unknown global descriptor: " << key; | 
|  | return base::MemoryMappedFile::Region::kWholeFile; | 
|  | } | 
|  |  | 
|  | void GlobalDescriptors::Reset(const Mapping& mapping) { | 
|  | descriptors_ = mapping; | 
|  | } | 
|  |  | 
|  | GlobalDescriptors::GlobalDescriptors() = default; | 
|  |  | 
|  | GlobalDescriptors::~GlobalDescriptors() = default; | 
|  |  | 
|  | }  // namespace base |