1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/posix/global_descriptors.h" 6 7 #include <vector> 8 #include <utility> 9 10 #include "base/logging.h" 11 12 namespace base { 13 14 GlobalDescriptors::Descriptor::Descriptor(Key key, int fd) 15 : key(key), fd(fd), region(base::MemoryMappedFile::Region::kWholeFile) { 16 } 17 18 GlobalDescriptors::Descriptor::Descriptor(Key key, 19 int fd, 20 base::MemoryMappedFile::Region region) 21 : key(key), fd(fd), region(region) { 22 } 23 24 // static 25 GlobalDescriptors* GlobalDescriptors::GetInstance() { 26 typedef Singleton<base::GlobalDescriptors, 27 LeakySingletonTraits<base::GlobalDescriptors> > 28 GlobalDescriptorsSingleton; 29 return GlobalDescriptorsSingleton::get(); 30 } 31 32 int GlobalDescriptors::Get(Key key) const { 33 const int ret = MaybeGet(key); 34 35 if (ret == -1) 36 DLOG(FATAL) << "Unknown global descriptor: " << key; 37 return ret; 38 } 39 40 int GlobalDescriptors::MaybeGet(Key key) const { 41 for (Mapping::const_iterator 42 i = descriptors_.begin(); i != descriptors_.end(); ++i) { 43 if (i->key == key) 44 return i->fd; 45 } 46 47 return -1; 48 } 49 50 base::ScopedFD GlobalDescriptors::TakeFD( 51 Key key, 52 base::MemoryMappedFile::Region* region) { 53 base::ScopedFD fd; 54 for (Mapping::iterator i = descriptors_.begin(); i != descriptors_.end(); 55 ++i) { 56 if (i->key == key) { 57 *region = i->region; 58 fd.reset(i->fd); 59 descriptors_.erase(i); 60 break; 61 } 62 } 63 return fd; 64 } 65 66 void GlobalDescriptors::Set(Key key, int fd) { 67 Set(key, fd, base::MemoryMappedFile::Region::kWholeFile); 68 } 69 70 void GlobalDescriptors::Set(Key key, 71 int fd, 72 base::MemoryMappedFile::Region region) { 73 for (auto& i : descriptors_) { 74 if (i.key == key) { 75 i.fd = fd; 76 i.region = region; 77 return; 78 } 79 } 80 81 descriptors_.push_back(Descriptor(key, fd, region)); 82 } 83 84 base::MemoryMappedFile::Region GlobalDescriptors::GetRegion(Key key) const { 85 for (const auto& i : descriptors_) { 86 if (i.key == key) 87 return i.region; 88 } 89 DLOG(FATAL) << "Unknown global descriptor: " << key; 90 return base::MemoryMappedFile::Region::kWholeFile; 91 } 92 93 void GlobalDescriptors::Reset(const Mapping& mapping) { 94 descriptors_ = mapping; 95 } 96 97 GlobalDescriptors::GlobalDescriptors() {} 98 99 GlobalDescriptors::~GlobalDescriptors() {} 100 101 } // namespace base 102