//===-- JITLoaderList.cpp -------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "lldb/Target/JITLoader.h"
#include "lldb/Target/JITLoaderList.h"
#include "lldb/lldb-private.h"

using namespace lldb;
using namespace lldb_private;

JITLoaderList::JITLoaderList() : m_jit_loaders_vec(), m_jit_loaders_mutex() {}

JITLoaderList::~JITLoaderList() {}

void JITLoaderList::Append(const JITLoaderSP &jit_loader_sp) {
  std::lock_guard<std::recursive_mutex> guard(m_jit_loaders_mutex);
  m_jit_loaders_vec.push_back(jit_loader_sp);
}

void JITLoaderList::Remove(const JITLoaderSP &jit_loader_sp) {
  std::lock_guard<std::recursive_mutex> guard(m_jit_loaders_mutex);
  m_jit_loaders_vec.erase(std::remove(m_jit_loaders_vec.begin(),
                                      m_jit_loaders_vec.end(), jit_loader_sp),
                          m_jit_loaders_vec.end());
}

size_t JITLoaderList::GetSize() const { return m_jit_loaders_vec.size(); }

JITLoaderSP JITLoaderList::GetLoaderAtIndex(size_t idx) {
  std::lock_guard<std::recursive_mutex> guard(m_jit_loaders_mutex);
  return m_jit_loaders_vec[idx];
}

void JITLoaderList::DidLaunch() {
  std::lock_guard<std::recursive_mutex> guard(m_jit_loaders_mutex);
  for (auto const &jit_loader : m_jit_loaders_vec)
    jit_loader->DidLaunch();
}

void JITLoaderList::DidAttach() {
  std::lock_guard<std::recursive_mutex> guard(m_jit_loaders_mutex);
  for (auto const &jit_loader : m_jit_loaders_vec)
    jit_loader->DidAttach();
}

void JITLoaderList::ModulesDidLoad(ModuleList &module_list) {
  std::lock_guard<std::recursive_mutex> guard(m_jit_loaders_mutex);
  for (auto const &jit_loader : m_jit_loaders_vec)
    jit_loader->ModulesDidLoad(module_list);
}
