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