//===-- QueueList.cpp -------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "lldb/Target/Queue.h"
#include "lldb/Target/Process.h"
#include "lldb/Target/QueueList.h"

using namespace lldb;
using namespace lldb_private;

QueueList::QueueList(Process *process)
    : m_process(process), m_stop_id(0), m_queues(), m_mutex() {}

QueueList::~QueueList() { Clear(); }

uint32_t QueueList::GetSize() {
  std::lock_guard<std::mutex> guard(m_mutex);
  return m_queues.size();
}

lldb::QueueSP QueueList::GetQueueAtIndex(uint32_t idx) {
  std::lock_guard<std::mutex> guard(m_mutex);
  if (idx < m_queues.size()) {
    return m_queues[idx];
  } else {
    return QueueSP();
  }
}

void QueueList::Clear() {
  std::lock_guard<std::mutex> guard(m_mutex);
  m_queues.clear();
}

void QueueList::AddQueue(QueueSP queue_sp) {
  std::lock_guard<std::mutex> guard(m_mutex);
  if (queue_sp.get()) {
    m_queues.push_back(queue_sp);
  }
}

lldb::QueueSP QueueList::FindQueueByID(lldb::queue_id_t qid) {
  QueueSP ret;
  for (QueueSP queue_sp : Queues()) {
    if (queue_sp->GetID() == qid) {
      ret = queue_sp;
      break;
    }
  }
  return ret;
}

lldb::QueueSP QueueList::FindQueueByIndexID(uint32_t index_id) {
  QueueSP ret;
  for (QueueSP queue_sp : Queues()) {
    if (queue_sp->GetIndexID() == index_id) {
      ret = queue_sp;
      break;
    }
  }
  return ret;
}

std::mutex &QueueList::GetMutex() { return m_mutex; }
