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

#ifndef lldb_AppleGetThreadItemInfoHandler_h_
#define lldb_AppleGetThreadItemInfoHandler_h_

// C Includes
// C++ Includes
#include <map>
#include <mutex>
#include <vector>

// Other libraries and framework includes
// Project includes
#include "lldb/Symbol/CompilerType.h"
#include "lldb/Utility/Status.h"
#include "lldb/lldb-public.h"

// This class will insert a UtilityFunction into the inferior process for
// calling libBacktraceRecording's
// __introspection_dispatch_thread_get_item_info()
// function.  The function in the inferior will return a struct by value
// with these members:
//
//     struct get_thread_item_info_return_values
//     {
//         introspection_dispatch_item_info_ref *item_buffer;
//         uint64_t item_buffer_size;
//     };
//
// The item_buffer pointer is an address in the inferior program's address
// space (item_buffer_size in size) which must be mach_vm_deallocate'd by
// lldb.
//
// The AppleGetThreadItemInfoHandler object should persist so that the
// UtilityFunction
// can be reused multiple times.

namespace lldb_private {

class AppleGetThreadItemInfoHandler {
public:
  AppleGetThreadItemInfoHandler(lldb_private::Process *process);

  ~AppleGetThreadItemInfoHandler();

  struct GetThreadItemInfoReturnInfo {
    lldb::addr_t item_buffer_ptr;  /* the address of the item buffer from
                                      libBacktraceRecording */
    lldb::addr_t item_buffer_size; /* the size of the item buffer from
                                      libBacktraceRecording */

    GetThreadItemInfoReturnInfo()
        : item_buffer_ptr(LLDB_INVALID_ADDRESS), item_buffer_size(0) {}
  };

  //----------------------------------------------------------
  /// Get the information about a work item by calling
  /// __introspection_dispatch_thread_get_item_info.  If there's a page of
  /// memory that needs to be freed, pass in the address and size and it will
  /// be freed before getting the list of queues.
  ///
  /// @param [in] thread_id
  ///     The thread to get the extended backtrace for.
  ///
  /// @param [in] page_to_free
  ///     An address of an inferior process vm page that needs to be
  ///     deallocated,
  ///     LLDB_INVALID_ADDRESS if this is not needed.
  ///
  /// @param [in] page_to_free_size
  ///     The size of the vm page that needs to be deallocated if an address was
  ///     passed in to page_to_free.
  ///
  /// @param [out] error
  ///     This object will be updated with the error status / error string from
  ///     any failures encountered.
  ///
  /// @returns
  ///     The result of the inferior function call execution.  If there was a
  ///     failure of any kind while getting
  ///     the information, the item_buffer_ptr value will be
  ///     LLDB_INVALID_ADDRESS.
  //----------------------------------------------------------
  GetThreadItemInfoReturnInfo GetThreadItemInfo(Thread &thread,
                                                lldb::tid_t thread_id,
                                                lldb::addr_t page_to_free,
                                                uint64_t page_to_free_size,
                                                lldb_private::Status &error);

  void Detach();

private:
  lldb::addr_t
  SetupGetThreadItemInfoFunction(Thread &thread,
                                 ValueList &get_thread_item_info_arglist);

  static const char *g_get_thread_item_info_function_name;
  static const char *g_get_thread_item_info_function_code;

  lldb_private::Process *m_process;
  std::unique_ptr<UtilityFunction> m_get_thread_item_info_impl_code;
  std::mutex m_get_thread_item_info_function_mutex;

  lldb::addr_t m_get_thread_item_info_return_buffer_addr;
  std::mutex m_get_thread_item_info_retbuffer_mutex;
};

} // using namespace lldb_private

#endif // lldb_AppleGetThreadItemInfoHandler_h_
