| // Copyright 2017 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/file_descriptor_store.h" | 
 |  | 
 | #include <utility> | 
 |  | 
 | #include "base/logging.h" | 
 |  | 
 | namespace base { | 
 |  | 
 | FileDescriptorStore::Descriptor::Descriptor(const std::string& key, | 
 |                                             base::ScopedFD fd) | 
 |     : key(key), | 
 |       fd(std::move(fd)), | 
 |       region(base::MemoryMappedFile::Region::kWholeFile) {} | 
 |  | 
 | FileDescriptorStore::Descriptor::Descriptor( | 
 |     const std::string& key, | 
 |     base::ScopedFD fd, | 
 |     base::MemoryMappedFile::Region region) | 
 |     : key(key), fd(std::move(fd)), region(region) {} | 
 |  | 
 | FileDescriptorStore::Descriptor::Descriptor( | 
 |     FileDescriptorStore::Descriptor&& other) | 
 |     : key(other.key), fd(std::move(other.fd)), region(other.region) {} | 
 |  | 
 | FileDescriptorStore::Descriptor::~Descriptor() = default; | 
 |  | 
 | // static | 
 | FileDescriptorStore& FileDescriptorStore::GetInstance() { | 
 |   static FileDescriptorStore* store = new FileDescriptorStore; | 
 |   return *store; | 
 | } | 
 |  | 
 | base::ScopedFD FileDescriptorStore::TakeFD( | 
 |     const std::string& key, | 
 |     base::MemoryMappedFile::Region* region) { | 
 |   base::ScopedFD fd = MaybeTakeFD(key, region); | 
 |   if (!fd.is_valid()) | 
 |     DLOG(DCHECK) << "Unknown global descriptor: " << key; | 
 |   return fd; | 
 | } | 
 |  | 
 | base::ScopedFD FileDescriptorStore::MaybeTakeFD( | 
 |     const std::string& key, | 
 |     base::MemoryMappedFile::Region* region) { | 
 |   auto iter = descriptors_.find(key); | 
 |   if (iter == descriptors_.end()) | 
 |     return base::ScopedFD(); | 
 |   *region = iter->second.region; | 
 |   base::ScopedFD result = std::move(iter->second.fd); | 
 |   descriptors_.erase(iter); | 
 |   return result; | 
 | } | 
 |  | 
 | void FileDescriptorStore::Set(const std::string& key, base::ScopedFD fd) { | 
 |   Set(key, std::move(fd), base::MemoryMappedFile::Region::kWholeFile); | 
 | } | 
 |  | 
 | void FileDescriptorStore::Set(const std::string& key, | 
 |                               base::ScopedFD fd, | 
 |                               base::MemoryMappedFile::Region region) { | 
 |   Descriptor descriptor(key, std::move(fd), region); | 
 |   descriptors_.insert(std::make_pair(key, std::move(descriptor))); | 
 | } | 
 |  | 
 | FileDescriptorStore::FileDescriptorStore() = default; | 
 |  | 
 | FileDescriptorStore::~FileDescriptorStore() = default; | 
 |  | 
 | }  // namespace base |