// 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__); }
bool ProcessPOSIX::IsAThreadRunning() { bool is_running = false; 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()); StateType thread_state = thread->GetState(); if (thread_state == eStateRunning || thread_state == eStateStepping) { is_running = true; break; } } return is_running; }