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 |