// Copyright 2017 The Chromium Authors
// 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() = default;

// 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(DCHECK) << "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();
  *region = iter->second.region;
  base::ScopedFD result = std::move(iter->second.fd);
  descriptors_.erase(iter);
  return result;
}

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() = default;

FileDescriptorStore::~FileDescriptorStore() = default;

}  // namespace base
