blob: 5a732dd6112daed4a62fa7ef900caac2af2b7469 [file]
//===----------------------------------------------------------------------===//
//
// 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/TargetGroupList.h"
#include "lldb/Core/Debugger.h"
#include "llvm/ADT/STLExtras.h"
using namespace lldb;
using namespace lldb_private;
TargetGroupList::~TargetGroupList() { Clear(); }
TargetGroupSP TargetGroupList::CreateTargetGroup(llvm::StringRef description) {
std::lock_guard<std::recursive_mutex> guard(*m_mutex);
TargetGroupSP group_sp(
new TargetGroup(m_debugger.shared_from_this(), description, m_mutex));
m_groups.push_back(group_sp);
return group_sp;
}
bool TargetGroupList::DeleteTargetGroup(const TargetGroupSP &group_sp) {
if (!group_sp)
return false;
std::lock_guard<std::recursive_mutex> guard(*m_mutex);
auto it = llvm::find(m_groups, group_sp);
if (it == m_groups.end())
return false;
m_groups.erase(it);
return true;
}
std::vector<TargetGroupSP> TargetGroupList::GetGroups() const {
std::lock_guard<std::recursive_mutex> guard(*m_mutex);
return m_groups;
}
void TargetGroupList::Add(const TargetGroupSP &group_sp) {
if (!group_sp)
return;
std::lock_guard<std::recursive_mutex> guard(*m_mutex);
if (!llvm::is_contained(m_groups, group_sp))
m_groups.push_back(group_sp);
}
void TargetGroupList::Remove(const TargetGroup *group) {
std::lock_guard<std::recursive_mutex> guard(*m_mutex);
llvm::erase_if(m_groups, [group](const TargetGroupSP &group_sp) {
return group_sp.get() == group;
});
}
void TargetGroupList::RemoveTarget(const TargetSP &target_sp) {
if (!target_sp)
return;
std::lock_guard<std::recursive_mutex> guard(*m_mutex);
std::vector<TargetGroupSP> groups = m_groups;
for (const TargetGroupSP &group_sp : groups) {
group_sp->RemoveTarget(target_sp);
if (group_sp->GetTargets().empty())
m_debugger.GetTargetGroupList().DeleteTargetGroup(group_sp);
}
m_groups.clear();
}
void TargetGroupList::Clear() {
std::lock_guard<std::recursive_mutex> guard(*m_mutex);
m_groups.clear();
}