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

FileDescriptorStore::~FileDescriptorStore() {}

}  // namespace base
