//===-- QueueItem.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/QueueItem.h"
#include "lldb/Target/SystemRuntime.h"

using namespace lldb;
using namespace lldb_private;

QueueItem::QueueItem (QueueSP queue_sp, ProcessSP process_sp, lldb::addr_t item_ref, lldb_private::Address address) :
    m_queue_wp (),
    m_process_wp (),
    m_item_ref (item_ref),
    m_address (address),
    m_have_fetched_entire_item (false),
    m_kind (eQueueItemKindUnknown),
    m_item_that_enqueued_this_ref (LLDB_INVALID_ADDRESS),
    m_enqueueing_thread_id (LLDB_INVALID_THREAD_ID),
    m_enqueueing_queue_id (LLDB_INVALID_QUEUE_ID),
    m_target_queue_id (LLDB_INVALID_QUEUE_ID),
    m_stop_id (0),
    m_backtrace(),
    m_thread_label(),
    m_queue_label(),
    m_target_queue_label()
{
    m_queue_wp = queue_sp;
    m_process_wp = process_sp;
}

QueueItem::~QueueItem ()
{
}

QueueItemKind
QueueItem::GetKind()
{
    FetchEntireItem ();
    return m_kind;
}

void
QueueItem::SetKind (QueueItemKind item_kind)
{
    m_kind = item_kind;
}

Address &
QueueItem::GetAddress () 
{
    return m_address;
}

void
QueueItem::SetAddress (Address addr)
{
    m_address = addr;
}

ThreadSP
QueueItem::GetExtendedBacktraceThread (ConstString type)
{
    FetchEntireItem ();
    ThreadSP return_thread;
    QueueSP queue_sp = m_queue_wp.lock();
    if (queue_sp)
    {
        ProcessSP process_sp = queue_sp->GetProcess();
        if (process_sp && process_sp->GetSystemRuntime())
        {
            return_thread = process_sp->GetSystemRuntime()->GetExtendedBacktraceForQueueItem (this->shared_from_this(), type);
        }
    }
    return return_thread;
}

lldb::addr_t
QueueItem::GetItemThatEnqueuedThis ()
{
    FetchEntireItem ();
    return m_item_that_enqueued_this_ref;
}

lldb::tid_t
QueueItem::GetEnqueueingThreadID ()
{
    FetchEntireItem ();
    return m_enqueueing_thread_id;
}

lldb::queue_id_t
QueueItem::GetEnqueueingQueueID ()
{    
    FetchEntireItem ();
    return m_enqueueing_queue_id;
} 

uint32_t
QueueItem::GetStopID ()
{
    FetchEntireItem ();
    return m_stop_id;
}

std::vector<lldb::addr_t> &
QueueItem::GetEnqueueingBacktrace ()
{
    FetchEntireItem ();
    return m_backtrace;
}

std::string
QueueItem::GetThreadLabel ()
{
    FetchEntireItem ();
    return m_thread_label;
}

std::string
QueueItem::GetQueueLabel ()
{
    FetchEntireItem ();
    return m_queue_label;
}


ProcessSP
QueueItem::GetProcessSP()
{
    return m_process_wp.lock ();
}

void
QueueItem::FetchEntireItem()
{
    if (m_have_fetched_entire_item == true)
        return;
    ProcessSP process_sp = m_process_wp.lock();
    if (process_sp)
    {
        SystemRuntime *runtime = process_sp->GetSystemRuntime();
        if (runtime)
        {
            runtime->CompleteQueueItem (this, m_item_ref);
            m_have_fetched_entire_item = true;
        }
    }
}
