10b57cec5SDimitry Andric //===-- Queue.cpp ---------------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "lldb/Target/Queue.h"
100b57cec5SDimitry Andric #include "lldb/Target/Process.h"
110b57cec5SDimitry Andric #include "lldb/Target/QueueList.h"
120b57cec5SDimitry Andric #include "lldb/Target/SystemRuntime.h"
130b57cec5SDimitry Andric #include "lldb/Target/Thread.h"
140b57cec5SDimitry Andric 
150b57cec5SDimitry Andric using namespace lldb;
160b57cec5SDimitry Andric using namespace lldb_private;
170b57cec5SDimitry Andric 
Queue(ProcessSP process_sp,lldb::queue_id_t queue_id,const char * queue_name)180b57cec5SDimitry Andric Queue::Queue(ProcessSP process_sp, lldb::queue_id_t queue_id,
190b57cec5SDimitry Andric              const char *queue_name)
200b57cec5SDimitry Andric     : m_process_wp(), m_queue_id(queue_id), m_queue_name(),
210b57cec5SDimitry Andric       m_running_work_items_count(0), m_pending_work_items_count(0),
220b57cec5SDimitry Andric       m_pending_items(), m_dispatch_queue_t_addr(LLDB_INVALID_ADDRESS),
230b57cec5SDimitry Andric       m_kind(eQueueKindUnknown) {
240b57cec5SDimitry Andric   if (queue_name)
250b57cec5SDimitry Andric     m_queue_name = queue_name;
260b57cec5SDimitry Andric 
270b57cec5SDimitry Andric   m_process_wp = process_sp;
280b57cec5SDimitry Andric }
290b57cec5SDimitry Andric 
300b57cec5SDimitry Andric Queue::~Queue() = default;
310b57cec5SDimitry Andric 
GetID()320b57cec5SDimitry Andric queue_id_t Queue::GetID() { return m_queue_id; }
330b57cec5SDimitry Andric 
GetName()340b57cec5SDimitry Andric const char *Queue::GetName() {
350b57cec5SDimitry Andric   return (m_queue_name.empty() ? nullptr : m_queue_name.c_str());
360b57cec5SDimitry Andric }
370b57cec5SDimitry Andric 
GetIndexID()380b57cec5SDimitry Andric uint32_t Queue::GetIndexID() { return m_queue_id; }
390b57cec5SDimitry Andric 
GetThreads()400b57cec5SDimitry Andric std::vector<lldb::ThreadSP> Queue::GetThreads() {
410b57cec5SDimitry Andric   std::vector<ThreadSP> result;
420b57cec5SDimitry Andric   ProcessSP process_sp = m_process_wp.lock();
430b57cec5SDimitry Andric   if (process_sp) {
440b57cec5SDimitry Andric     for (ThreadSP thread_sp : process_sp->Threads()) {
450b57cec5SDimitry Andric       if (thread_sp->GetQueueID() == m_queue_id) {
460b57cec5SDimitry Andric         result.push_back(thread_sp);
470b57cec5SDimitry Andric       }
480b57cec5SDimitry Andric     }
490b57cec5SDimitry Andric   }
500b57cec5SDimitry Andric   return result;
510b57cec5SDimitry Andric }
520b57cec5SDimitry Andric 
SetNumRunningWorkItems(uint32_t count)530b57cec5SDimitry Andric void Queue::SetNumRunningWorkItems(uint32_t count) {
540b57cec5SDimitry Andric   m_running_work_items_count = count;
550b57cec5SDimitry Andric }
560b57cec5SDimitry Andric 
GetNumRunningWorkItems() const570b57cec5SDimitry Andric uint32_t Queue::GetNumRunningWorkItems() const {
580b57cec5SDimitry Andric   return m_running_work_items_count;
590b57cec5SDimitry Andric }
600b57cec5SDimitry Andric 
SetNumPendingWorkItems(uint32_t count)610b57cec5SDimitry Andric void Queue::SetNumPendingWorkItems(uint32_t count) {
620b57cec5SDimitry Andric   m_pending_work_items_count = count;
630b57cec5SDimitry Andric }
640b57cec5SDimitry Andric 
GetNumPendingWorkItems() const650b57cec5SDimitry Andric uint32_t Queue::GetNumPendingWorkItems() const {
660b57cec5SDimitry Andric   return m_pending_work_items_count;
670b57cec5SDimitry Andric }
680b57cec5SDimitry Andric 
SetLibdispatchQueueAddress(addr_t dispatch_queue_t_addr)690b57cec5SDimitry Andric void Queue::SetLibdispatchQueueAddress(addr_t dispatch_queue_t_addr) {
700b57cec5SDimitry Andric   m_dispatch_queue_t_addr = dispatch_queue_t_addr;
710b57cec5SDimitry Andric }
720b57cec5SDimitry Andric 
GetLibdispatchQueueAddress() const730b57cec5SDimitry Andric addr_t Queue::GetLibdispatchQueueAddress() const {
740b57cec5SDimitry Andric   return m_dispatch_queue_t_addr;
750b57cec5SDimitry Andric }
760b57cec5SDimitry Andric 
GetPendingItems()770b57cec5SDimitry Andric const std::vector<lldb::QueueItemSP> &Queue::GetPendingItems() {
780b57cec5SDimitry Andric   if (m_pending_items.empty()) {
790b57cec5SDimitry Andric     ProcessSP process_sp = m_process_wp.lock();
800b57cec5SDimitry Andric     if (process_sp && process_sp->GetSystemRuntime()) {
810b57cec5SDimitry Andric       process_sp->GetSystemRuntime()->PopulatePendingItemsForQueue(this);
820b57cec5SDimitry Andric     }
830b57cec5SDimitry Andric   }
840b57cec5SDimitry Andric   return m_pending_items;
850b57cec5SDimitry Andric }
860b57cec5SDimitry Andric 
GetKind()870b57cec5SDimitry Andric lldb::QueueKind Queue::GetKind() { return m_kind; }
880b57cec5SDimitry Andric 
SetKind(lldb::QueueKind kind)890b57cec5SDimitry Andric void Queue::SetKind(lldb::QueueKind kind) { m_kind = kind; }
90