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

#ifndef liblldb_TargetList_h_
#define liblldb_TargetList_h_

// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
#include "lldb/Core/Broadcaster.h"
#include "lldb/Host/Mutex.h"
#include "lldb/Target/Target.h"

namespace lldb_private {

class TargetList : public Broadcaster
{
private:
    friend class Debugger;

    //------------------------------------------------------------------
    /// Constructor
    ///
    /// The constructor for the target list is private. Clients can
    /// get ahold of of the one and only target list through the
    /// lldb_private::Debugger::GetSharedInstance().GetTargetList().
    ///
    /// @see static TargetList& lldb_private::Debugger::GetTargetList().
    //------------------------------------------------------------------
    TargetList();

public:

    //------------------------------------------------------------------
    /// Broadcaster event bits definitions.
    //------------------------------------------------------------------
    enum
    {
        eBroadcastBitInterrupt = (1 << 0)
    };


    ~TargetList();

    //------------------------------------------------------------------
    /// Create a new Target.
    ///
    /// Clients must use this function to create a Target. This allows
    /// a global list of targets to be maintained in a central location
    /// so signal handlers and other global functions can use it to
    /// locate an appropriate target to deliver asynchronous information
    /// to.
    ///
    /// @param[in] file_spec
    ///     The main executable file for a debug target. This value
    ///     can be NULL and the file can be set later using:
    ///     Target::SetExecutableModule (ModuleSP&)
    ///
    /// @param[in] arch
    ///     The architecture to use when launching the \a file_spec for
    ///     debugging. This can be NULL if the architecture is not known
    ///     or when attaching to a process.
    ///
    /// @param[in] uuid_ptr
    ///     An optional UUID to use when loading a target. When this is
    ///     specified, plug-ins might be able to track down a different
    ///     executable than the one on disk specified by "file_spec" in
    ///     an alternate SDK or build location (such as when doing
    ///     symbolication on non-native OS builds).
    ///
    /// @return
    ///     A shared pointer to a target object.
    //------------------------------------------------------------------
    Error
    CreateTarget (Debugger &debugger,
                  const FileSpec& file_spec,
                  const ArchSpec& arch,
                  const lldb_private::UUID *uuid_ptr,
                  bool get_dependent_files,
                  lldb::TargetSP &target_sp);

    //------------------------------------------------------------------
    /// Delete a Target object from the list.
    ///
    /// When clients are done with the Target objets, this function
    /// should be called to release the memory associated with a target
    /// object.
    ///
    /// @param[in] target_sp
    ///     The shared pointer to a target.
    ///
    /// @return
    ///     Returns \b true if the target was successfully removed from
    ///     from this target list, \b false otherwise. The client will
    ///     be left with the last remaining shared pointer to the target
    ///     in \a target_sp which can then be properly released.
    //------------------------------------------------------------------
    bool
    DeleteTarget (lldb::TargetSP &target_sp);

    int
    GetNumTargets () const;

    lldb::TargetSP
    GetTargetAtIndex (uint32_t index) const;

    //------------------------------------------------------------------
    /// Find the target that contains has an executable whose path
    /// matches \a exe_file_spec, and whose architecture matches
    /// \a arch_ptr if arch_ptr is not NULL.
    ///
    /// @param[in] exe_file_spec
    ///     A file spec containing a basename, or a full path (directory
    ///     and basename). If \a exe_file_spec contains only a filename
    ///     (empty GetDirectory() value) then matching will be done
    ///     solely based on the filenames and directories won't be
    ///     compared. If \a exe_file_spec contains a filename and a
    ///     directory, then both must match.
    ///
    /// @param[in] exe_arch_ptr
    ///     If not NULL then the architecture also needs to match, else
    ///     the architectures will be compared.
    ///
    /// @return
    ///     A shared pointer to a target object. The returned shared
    ///     pointer will contain NULL if no target objects have a
    ///     executable whose full or partial path matches
    ///     with a matching process ID.
    //------------------------------------------------------------------
    lldb::TargetSP
    FindTargetWithExecutableAndArchitecture (const FileSpec &exe_file_spec,
                                             const ArchSpec *exe_arch_ptr = NULL) const;

    //------------------------------------------------------------------
    /// Find the target that contains a process with process ID \a
    /// pid.
    ///
    /// @param[in] pid
    ///     The process ID to search our target list for.
    ///
    /// @return
    ///     A shared pointer to a target object. The returned shared
    ///     pointer will contain NULL if no target objects own a process
    ///     with a matching process ID.
    //------------------------------------------------------------------
    lldb::TargetSP
    FindTargetWithProcessID (lldb::pid_t pid) const;

    lldb::TargetSP
    FindTargetWithProcess (lldb_private::Process *process) const;

    lldb::TargetSP
    GetTargetSP (Target *target) const;

    //------------------------------------------------------------------
    /// Send an async interrupt to one or all processes.
    ///
    /// Find the target that contains the process with process ID \a
    /// pid and send a LLDB_EVENT_ASYNC_INTERRUPT event to the process's
    /// event queue.
    ///
    /// @param[in] pid
    ///     The process ID to search our target list for, if \a pid is
    ///     LLDB_INVALID_PROCESS_ID, then the interrupt will be sent to
    ///     all processes.
    ///
    /// @return
    ///     The number of async interrupts sent.
    //------------------------------------------------------------------
    uint32_t
    SendAsyncInterrupt (lldb::pid_t pid = LLDB_INVALID_PROCESS_ID);

    uint32_t
    SignalIfRunning (lldb::pid_t pid, int signo);

    uint32_t
    SetSelectedTarget (Target *target);

    void
    SetSelectedTargetWithIndex (uint32_t idx);

    lldb::TargetSP
    GetSelectedTarget ();


protected:
    typedef std::vector<lldb::TargetSP> collection;
    //------------------------------------------------------------------
    // Member variables.
    //------------------------------------------------------------------
    collection m_target_list;
    mutable Mutex m_target_list_mutex;
    uint32_t m_selected_target_idx;
private:
    DISALLOW_COPY_AND_ASSIGN (TargetList);
};

} // namespace lldb_private

#endif  // liblldb_TargetList_h_
