|  | // 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. | 
|  |  | 
|  | #ifndef BASE_FILE_DESCRIPTOR_STORE_H_ | 
|  | #define BASE_FILE_DESCRIPTOR_STORE_H_ | 
|  |  | 
|  | #include <map> | 
|  | #include <string> | 
|  |  | 
|  | #include "base/files/memory_mapped_file.h" | 
|  | #include "base/files/scoped_file.h" | 
|  | #include "base/macros.h" | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | // The file descriptor store is used to associate file descriptors with keys | 
|  | // that must be unique. | 
|  | // It is used to share file descriptors from a process to its child. | 
|  | class BASE_EXPORT FileDescriptorStore { | 
|  | public: | 
|  | struct Descriptor { | 
|  | Descriptor(const std::string& key, base::ScopedFD fd); | 
|  | Descriptor(const std::string& key, | 
|  | base::ScopedFD fd, | 
|  | base::MemoryMappedFile::Region region); | 
|  | Descriptor(Descriptor&& other); | 
|  | ~Descriptor(); | 
|  |  | 
|  | Descriptor& operator=(Descriptor&& other) = default; | 
|  |  | 
|  | // Globally unique key. | 
|  | std::string key; | 
|  | // Actual FD. | 
|  | base::ScopedFD fd; | 
|  | // Optional region, defaults to kWholeFile. | 
|  | base::MemoryMappedFile::Region region; | 
|  | }; | 
|  | using Mapping = std::map<std::string, Descriptor>; | 
|  |  | 
|  | // Returns the singleton instance of FileDescriptorStore. | 
|  | static FileDescriptorStore& GetInstance(); | 
|  |  | 
|  | // Gets a descriptor given a key and also populates |region|. | 
|  | // It is a fatal error if the key is not known. | 
|  | base::ScopedFD TakeFD(const std::string& key, | 
|  | base::MemoryMappedFile::Region* region); | 
|  |  | 
|  | // Gets a descriptor given a key. Returns an empty ScopedFD on error. | 
|  | base::ScopedFD MaybeTakeFD(const std::string& key, | 
|  | base::MemoryMappedFile::Region* region); | 
|  |  | 
|  | // Sets the descriptor for the given |key|. This sets the region associated | 
|  | // with |key| to kWholeFile. | 
|  | void Set(const std::string& key, base::ScopedFD fd); | 
|  |  | 
|  | // Sets the descriptor and |region| for the given |key|. | 
|  | void Set(const std::string& key, | 
|  | base::ScopedFD fd, | 
|  | base::MemoryMappedFile::Region region); | 
|  |  | 
|  | private: | 
|  | FileDescriptorStore(); | 
|  | ~FileDescriptorStore(); | 
|  |  | 
|  | Mapping descriptors_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(FileDescriptorStore); | 
|  | }; | 
|  |  | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_FILE_DESCRIPTOR_STORE_H_ |