15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===-- CommandObjectQuit.cpp -----------------------------------*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb/lldb-python.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "CommandObjectQuit.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// C Includes
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// C++ Includes
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Other libraries and framework includes
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Project includes
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb/Interpreter/CommandInterpreter.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb/Interpreter/CommandReturnObject.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using namespace lldb;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using namespace lldb_private;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//-------------------------------------------------------------------------
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CommandObjectQuit
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//-------------------------------------------------------------------------
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CommandObjectQuit::CommandObjectQuit (CommandInterpreter &interpreter) :
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CommandObjectParsed (interpreter, "quit", "Quit out of the LLDB debugger.", "quit")
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CommandObjectQuit::~CommandObjectQuit ()
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// returns true if there is at least one alive process
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is_a_detach will be true if all alive processes will be detached when you quit
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and false if at least one process will be killed instead
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CommandObjectQuit::ShouldAskForConfirmation (bool& is_a_detach)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (m_interpreter.GetPromptOnQuit() == false)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool should_prompt = false;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_a_detach = true;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (uint32_t debugger_idx = 0;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         debugger_idx < Debugger::GetNumDebuggers();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         debugger_idx++)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DebuggerSP debugger_sp(Debugger::GetDebuggerAtIndex(debugger_idx));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!debugger_sp)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            continue;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const TargetList& target_list(debugger_sp->GetTargetList());
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (uint32_t target_idx = 0;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             target_idx < target_list.GetNumTargets();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             target_idx++)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            TargetSP target_sp(target_list.GetTargetAtIndex(target_idx));
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!target_sp)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                continue;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ProcessSP process_sp(target_sp->GetProcessSP());
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (process_sp
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                && process_sp->IsValid()
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                && process_sp->IsAlive()
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                && process_sp->WarnBeforeDetach())
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                should_prompt = true;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                if (process_sp->GetShouldDetach() == false)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    // if we need to kill at least one process, just say so and return
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    is_a_detach = false;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    return should_prompt;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return should_prompt;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CommandObjectQuit::DoExecute (Args& command, CommandReturnObject &result)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_a_detach = true;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ShouldAskForConfirmation (is_a_detach))
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        StreamString message;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        message.Printf("Quitting LLDB will %s one or more processes. Do you really want to proceed", (is_a_detach ? "detach from" : "kill"));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!m_interpreter.Confirm(message.GetData(), true))
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            result.SetStatus(eReturnStatusFailed);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return false;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m_interpreter.BroadcastEvent (CommandInterpreter::eBroadcastBitQuitCommandReceived);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result.SetStatus (eReturnStatusQuit);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)