//===-- DebuggerThread.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_Plugins_Process_Windows_DebuggerThread_H_
#define liblldb_Plugins_Process_Windows_DebuggerThread_H_

#include <atomic>
#include <memory>

#include "ForwardDecl.h"
#include "lldb/Host/HostProcess.h"
#include "lldb/Host/HostThread.h"
#include "lldb/Host/Predicate.h"
#include "lldb/Host/windows/windows.h"

namespace lldb_private
{

//----------------------------------------------------------------------
// DebuggerThread
//
// Debugs a single process, notifying listeners as appropriate when interesting
// things occur.
//----------------------------------------------------------------------
class DebuggerThread : public std::enable_shared_from_this<DebuggerThread>
{
  public:
    DebuggerThread(DebugDelegateSP debug_delegate);
    virtual ~DebuggerThread();

    Error DebugLaunch(const ProcessLaunchInfo &launch_info);
    Error DebugAttach(lldb::pid_t pid, const ProcessAttachInfo &attach_info);

    HostProcess
    GetProcess() const
    {
        return m_process;
    }
    HostThread
    GetMainThread() const
    {
        return m_main_thread;
    }
    std::weak_ptr<ExceptionRecord>
    GetActiveException()
    {
        return m_active_exception;
    }

    Error StopDebugging(bool terminate);

    void ContinueAsyncException(ExceptionResult result);

  private:
    void FreeProcessHandles();
    void DebugLoop();
    ExceptionResult HandleExceptionEvent(const EXCEPTION_DEBUG_INFO &info, DWORD thread_id);
    DWORD HandleCreateThreadEvent(const CREATE_THREAD_DEBUG_INFO &info, DWORD thread_id);
    DWORD HandleCreateProcessEvent(const CREATE_PROCESS_DEBUG_INFO &info, DWORD thread_id);
    DWORD HandleExitThreadEvent(const EXIT_THREAD_DEBUG_INFO &info, DWORD thread_id);
    DWORD HandleExitProcessEvent(const EXIT_PROCESS_DEBUG_INFO &info, DWORD thread_id);
    DWORD HandleLoadDllEvent(const LOAD_DLL_DEBUG_INFO &info, DWORD thread_id);
    DWORD HandleUnloadDllEvent(const UNLOAD_DLL_DEBUG_INFO &info, DWORD thread_id);
    DWORD HandleODSEvent(const OUTPUT_DEBUG_STRING_INFO &info, DWORD thread_id);
    DWORD HandleRipEvent(const RIP_INFO &info, DWORD thread_id);

    DebugDelegateSP m_debug_delegate;

    HostProcess m_process;    // The process being debugged.
    HostThread m_main_thread; // The main thread of the inferior.
    HANDLE m_image_file;      // The image file of the process being debugged.

    ExceptionRecordSP m_active_exception; // The current exception waiting to be handled

    Predicate<ExceptionResult> m_exception_pred; // A predicate which gets signalled when an exception
                                                 // is finished processing and the debug loop can be
                                                 // continued.

    HANDLE m_debugging_ended_event; // An event which gets signalled by the debugger thread when it
                                    // exits the debugger loop and is detached from the inferior.

    std::atomic<DWORD> m_pid_to_detach;  // Signals the loop to detach from the process (specified by pid).
    std::atomic<bool> m_is_shutting_down;   // Signals the debug loop to stop processing certain types of
                                            // events that block shutdown.
    bool m_detached;  // Indicates we've detached from the inferior process and the debug loop can exit.

    static lldb::thread_result_t DebuggerThreadLaunchRoutine(void *data);
    lldb::thread_result_t DebuggerThreadLaunchRoutine(const ProcessLaunchInfo &launch_info);
    static lldb::thread_result_t DebuggerThreadAttachRoutine(void *data);
    lldb::thread_result_t DebuggerThreadAttachRoutine(lldb::pid_t pid, const ProcessAttachInfo &launch_info);
};
}

#endif
