//===-- QueueList.h --------------------------------------------*- C++ -*-===//
//
// 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
//
//===----------------------------------------------------------------------===//

#ifndef liblldb_QueueList_h_
#define liblldb_QueueList_h_

#include <mutex>
#include <vector>

#include "lldb/Utility/Iterable.h"
#include "lldb/Utility/UserID.h"
#include "lldb/lldb-private.h"

namespace lldb_private {

// QueueList:
// This is the container for libdispatch aka Grand Central Dispatch Queue
// objects.
//
// Each Process will have a QueueList.  When the process execution is paused,
// the QueueList may be populated with Queues by the SystemRuntime.

class QueueList {
  friend class Process;

public:
  QueueList(Process *process);

  ~QueueList();

  /// Get the number of libdispatch queues that are available
  ///
  /// \return
  ///     The number of queues that are stored in the QueueList.
  uint32_t GetSize();

  /// Get the Queue at a given index number
  ///
  /// \param [in] idx
  ///     The index number (0-based) of the queue.
  /// \return
  ///     The Queue at that index number.
  lldb::QueueSP GetQueueAtIndex(uint32_t idx);

  typedef std::vector<lldb::QueueSP> collection;
  typedef LockingAdaptedIterable<collection, lldb::QueueSP, vector_adapter,
                                 std::mutex>
      QueueIterable;

  /// Iterate over the list of queues
  ///
  /// \return
  ///     An Iterable object which can be used to loop over the queues
  ///     that exist.
  QueueIterable Queues() { return QueueIterable(m_queues, m_mutex); }

  /// Clear out the list of queues from the QueueList
  void Clear();

  /// Add a Queue to the QueueList
  ///
  /// \param [in] queue
  ///     Used by the SystemRuntime to populate the QueueList
  void AddQueue(lldb::QueueSP queue);

  /// Find a queue in the QueueList by QueueID
  ///
  /// \param [in] qid
  ///     The QueueID (same as returned by Thread::GetQueueID()) to find.
  ///
  /// \return
  ///     A QueueSP to the queue requested, if it is present in the QueueList.
  ///     An empty QueueSP will be returned if this queue was not found.
  lldb::QueueSP FindQueueByID(lldb::queue_id_t qid);

  /// Find a queue in the QueueList by IndexID
  ///
  /// \param [in] index_id
  ///     Find a queue by IndexID.  This is an integer associated with each
  ///     unique queue seen during a debug session and will not be reused
  ///     for a different queue.  Unlike the QueueID, a 64-bit value, this
  ///     will tend to be an integral value like 1 or 7.
  ///
  /// \return
  ///     A QueueSP to the queue requested, if it is present in the QueueList.
  ///     An empty QueueSP will be returned if this queue was not found.
  lldb::QueueSP FindQueueByIndexID(uint32_t index_id);

  std::mutex &GetMutex();

protected:
  // Classes that inherit from Process can see and modify these
  Process *m_process; ///< The process that manages this queue list.
  uint32_t
      m_stop_id; ///< The process stop ID that this queue list is valid for.
  collection m_queues; ///< The queues for this process.
  std::mutex m_mutex;

private:
  QueueList() = delete;
};

} // namespace lldb_private

#endif // liblldb_QueueList_h_
