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

// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
#include "lldb/Target/Process.h"
#include "lldb/Target/Queue.h"
#include "lldb/Target/QueueList.h"
#include "lldb/Target/Thread.h"
#include "lldb/Target/SystemRuntime.h"

using namespace lldb;
using namespace lldb_private;

Queue::Queue (ProcessSP process_sp, lldb::queue_id_t queue_id, const char *queue_name) :
    m_process_wp (),
    m_queue_id (queue_id),
    m_queue_name (),
    m_running_work_items_count(0),
    m_pending_work_items_count(0),
    m_pending_items(),
    m_dispatch_queue_t_addr(LLDB_INVALID_ADDRESS),
    m_kind (eQueueKindUnknown)
{
    if (queue_name)
        m_queue_name = queue_name;

    m_process_wp = process_sp;
}

Queue::~Queue() = default;

queue_id_t
Queue::GetID ()
{
    return m_queue_id;
}

const char *
Queue::GetName ()
{
    return (m_queue_name.empty() ? nullptr : m_queue_name.c_str());
}

uint32_t
Queue::GetIndexID ()
{
    return m_queue_id;
}

std::vector<lldb::ThreadSP>
Queue::GetThreads ()
{
    std::vector<ThreadSP> result;
    ProcessSP process_sp = m_process_wp.lock();
    if (process_sp)
    {
        for (ThreadSP thread_sp : process_sp->Threads())
        {
            if (thread_sp->GetQueueID() == m_queue_id)
            {
                result.push_back (thread_sp);
            }
        }
    }
    return result;
}

void
Queue::SetNumRunningWorkItems (uint32_t count)
{
    m_running_work_items_count = count;
}

uint32_t
Queue::GetNumRunningWorkItems () const
{
    return m_running_work_items_count;
}

void
Queue::SetNumPendingWorkItems (uint32_t count)
{
    m_pending_work_items_count = count;
}

uint32_t
Queue::GetNumPendingWorkItems () const
{
    return m_pending_work_items_count;
}

void
Queue::SetLibdispatchQueueAddress (addr_t dispatch_queue_t_addr)
{
    m_dispatch_queue_t_addr = dispatch_queue_t_addr;
}

addr_t
Queue::GetLibdispatchQueueAddress () const
{
    return m_dispatch_queue_t_addr;
}

const std::vector<lldb::QueueItemSP> &
Queue::GetPendingItems ()
{
    if (m_pending_items.empty())
    {
        ProcessSP process_sp = m_process_wp.lock();
        if (process_sp && process_sp->GetSystemRuntime())
        {
            process_sp->GetSystemRuntime()->PopulatePendingItemsForQueue (this);
        }
    }
    return m_pending_items;
}

lldb::QueueKind
Queue::GetKind ()
{
    return m_kind;
}

void
Queue::SetKind (lldb::QueueKind kind)
{
    m_kind = kind;
}
