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