| Index: base/file_descriptor_store.cc
|
| diff --git a/base/file_descriptor_store.cc b/base/file_descriptor_store.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..74a55df6b4e844a658cbceec2c5b0817ed54aee1
|
| --- /dev/null
|
| +++ b/base/file_descriptor_store.cc
|
| @@ -0,0 +1,81 @@
|
| +// 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() {}
|
| +
|
| +FileDescriptorStore::Descriptor& FileDescriptorStore::Descriptor::operator=(
|
| + FileDescriptorStore::Descriptor&& other) {
|
| + key = other.key;
|
| + fd = std::move(other.fd);
|
| + region = other.region;
|
| + return *this;
|
| +}
|
| +
|
| +// 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(FATAL) << "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();
|
| + descriptors_.erase(iter);
|
| + if (region)
|
| + *region = iter->second.region;
|
| + return std::move(iter->second.fd);
|
| +}
|
| +
|
| +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() {}
|
| +
|
| +FileDescriptorStore::~FileDescriptorStore() {}
|
| +
|
| +} // namespace base
|
|
|