// Copyright 2019 The Fuchsia 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 "memory_allocator.h"

#include <lib/sysmem-version/sysmem-version.h>
#include <zircon/assert.h>

#include <atomic>

namespace sysmem_service {

MemoryAllocator::MemoryAllocator(fuchsia_hardware_sysmem::HeapProperties properties)
    : heap_properties_(std::move(properties)) {
  static std::atomic_uint64_t id;
  id_ = id++;
}

MemoryAllocator::~MemoryAllocator() {
  for (auto& it : destroy_callbacks_) {
    it.second();
  }
}

// only called on secure allocators
void MemoryAllocator::set_ready() { ZX_PANIC("not implemented"); }
// only called on secure allocators
void MemoryAllocator::clear_ready() { ZX_PANIC("not implemented"); }

bool MemoryAllocator::is_ready() { return true; }

void MemoryAllocator::AddDestroyCallback(intptr_t key, fit::callback<void()> callback) {
  ZX_DEBUG_ASSERT(destroy_callbacks_.find(key) == destroy_callbacks_.end());
  destroy_callbacks_[key] = std::move(callback);
}

void MemoryAllocator::RemoveDestroyCallback(intptr_t key) {
  // The key isn't required to be in the map in case of failures during
  // create.  Erase if present.
  destroy_callbacks_.erase(key);
}

}  // namespace sysmem_service
