124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- CommandObjectQuit.cpp -----------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h"
11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "CommandObjectQuit.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
18b4a4728ce4abd61a2d5be9ae925e1a81d56e4b5dEli Friedman#include "lldb/Interpreter/CommandInterpreter.h"
19b4a4728ce4abd61a2d5be9ae925e1a81d56e4b5dEli Friedman#include "lldb/Interpreter/CommandReturnObject.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectQuit
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28238c0a1e7b733cee539258faa656159c63f9e893Greg ClaytonCommandObjectQuit::CommandObjectQuit (CommandInterpreter &interpreter) :
29da26bd203cbb104291b39891febf7481794f205fJim Ingham    CommandObjectParsed (interpreter, "quit", "Quit out of the LLDB debugger.", "quit")
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectQuit::~CommandObjectQuit ()
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata// returns true if there is at least one alive process
38dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata// is_a_detach will be true if all alive processes will be detached when you quit
39dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata// and false if at least one process will be killed instead
40dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granatabool
41dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico GranataCommandObjectQuit::ShouldAskForConfirmation (bool& is_a_detach)
42dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata{
43dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata    if (m_interpreter.GetPromptOnQuit() == false)
44dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata        return false;
45dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata    bool should_prompt = false;
46dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata    is_a_detach = true;
47dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata    for (uint32_t debugger_idx = 0;
48dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata         debugger_idx < Debugger::GetNumDebuggers();
49dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata         debugger_idx++)
50dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata    {
51dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata        DebuggerSP debugger_sp(Debugger::GetDebuggerAtIndex(debugger_idx));
52dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata        if (!debugger_sp)
53dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata            continue;
54dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata        const TargetList& target_list(debugger_sp->GetTargetList());
55dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata        for (uint32_t target_idx = 0;
56dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata             target_idx < target_list.GetNumTargets();
57dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata             target_idx++)
58dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata        {
59dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata            TargetSP target_sp(target_list.GetTargetAtIndex(target_idx));
60dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata            if (!target_sp)
61dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata                continue;
62dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata            ProcessSP process_sp(target_sp->GetProcessSP());
63ba065cab7acc8ef7fbedc27af5d18c3a694a084aJason Molenda            if (process_sp
64ba065cab7acc8ef7fbedc27af5d18c3a694a084aJason Molenda                && process_sp->IsValid()
65ba065cab7acc8ef7fbedc27af5d18c3a694a084aJason Molenda                && process_sp->IsAlive()
66ba065cab7acc8ef7fbedc27af5d18c3a694a084aJason Molenda                && process_sp->WarnBeforeDetach())
67dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata            {
68dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata                should_prompt = true;
69dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata                if (process_sp->GetShouldDetach() == false)
70dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata                {
71dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata                    // if we need to kill at least one process, just say so and return
72dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata                    is_a_detach = false;
73dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata                    return should_prompt;
74dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata                }
75dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata            }
76dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata        }
77dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata    }
78dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata    return should_prompt;
79dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata}
80dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
82da26bd203cbb104291b39891febf7481794f205fJim InghamCommandObjectQuit::DoExecute (Args& command, CommandReturnObject &result)
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
84dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata    bool is_a_detach = true;
85dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata    if (ShouldAskForConfirmation (is_a_detach))
86dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata    {
87dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata        StreamString message;
88dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata        message.Printf("Quitting LLDB will %s one or more processes. Do you really want to proceed", (is_a_detach ? "detach from" : "kill"));
89dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata        if (!m_interpreter.Confirm(message.GetData(), true))
90dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata        {
91dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata            result.SetStatus(eReturnStatusFailed);
92dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata            return false;
93dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata        }
94dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata    }
95238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    m_interpreter.BroadcastEvent (CommandInterpreter::eBroadcastBitQuitCommandReceived);
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    result.SetStatus (eReturnStatusQuit);
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
100