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