| // 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 |