Chromium Code Reviews| 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) { |
|
dcheng
2017/02/10 08:44:15
I think this and the move ctor can be explicitly d
Jay Civelli
2017/02/13 18:48:25
If I default the move constructor, I get a "Compl
dcheng
2017/02/15 08:05:27
Sorry, to clarify, they should only be declared in
|
| + 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; |
|
dcheng
2017/02/10 08:44:15
Isn't referencing |iter| here undefined behavior?
Jay Civelli
2017/02/13 18:48:25
You are right! Fixed.
|
| + 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 |