Error ProcessPOSIX::DoDetach(bool keep_stopped) { Error error; if (keep_stopped) { // FIXME: If you want to implement keep_stopped, // this would be the place to do it. error.SetErrorString("Detaching with keep_stopped true is not currently supported on this platform."); return error; } Mutex::Locker lock(m_thread_list.GetMutex()); uint32_t thread_count = m_thread_list.GetSize(false); for (uint32_t i = 0; i < thread_count; ++i) { POSIXThread *thread = static_cast<POSIXThread*>( m_thread_list.GetThreadAtIndex(i, false).get()); error = m_monitor->Detach(thread->GetID()); } if (error.Success()) SetPrivateState(eStateDetached); return error; }
// ProcessPOSIX override void ProcessLinux::StopAllThreads(lldb::tid_t stop_tid) { // If a breakpoint occurs while we're stopping threads, we'll get back // here, but we don't want to do it again. Only the MonitorChildProcess // thread calls this function, so we don't need to protect this flag. if (m_stopping_threads) return; m_stopping_threads = true; Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PROCESS)); if (log) log->Printf ("ProcessLinux::%s() stopping all threads", __FUNCTION__); // Walk the thread list and stop the other threads. The thread that caused // the stop should already be marked as stopped before we get here. Mutex::Locker thread_list_lock(m_thread_list.GetMutex()); uint32_t thread_count = m_thread_list.GetSize(false); for (uint32_t i = 0; i < thread_count; ++i) { POSIXThread *thread = static_cast<POSIXThread*>( m_thread_list.GetThreadAtIndex(i, false).get()); assert(thread); lldb::tid_t tid = thread->GetID(); if (!StateIsStoppedState(thread->GetState(), false)) m_monitor->StopThread(tid); } m_stopping_threads = false; if (log) log->Printf ("ProcessLinux::%s() finished", __FUNCTION__); }