// 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() {}

// 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();
  *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() {}

FileDescriptorStore::~FileDescriptorStore() {}

}  // namespace base
