diff options
Diffstat (limited to 'base/file_descriptor_store.h')
-rw-r--r-- | base/file_descriptor_store.h | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/base/file_descriptor_store.h b/base/file_descriptor_store.h new file mode 100644 index 0000000000..b6bd079916 --- /dev/null +++ b/base/file_descriptor_store.h @@ -0,0 +1,73 @@ +// 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_ |