1 //===-- ThreadList.cpp ------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 #include <stdlib.h> 10 11 #include <algorithm> 12 13 #include "lldb/Core/Log.h" 14 #include "lldb/Target/RegisterContext.h" 15 #include "lldb/Target/ThreadList.h" 16 #include "lldb/Target/Thread.h" 17 #include "lldb/Target/ThreadPlan.h" 18 #include "lldb/Target/Process.h" 19 20 using namespace lldb; 21 using namespace lldb_private; 22 23 ThreadList::ThreadList (Process *process) : 24 m_process (process), 25 m_stop_id (0), 26 m_threads(), 27 m_threads_mutex (Mutex::eMutexTypeRecursive), 28 m_selected_tid (LLDB_INVALID_THREAD_ID) 29 { 30 } 31 32 ThreadList::ThreadList (const ThreadList &rhs) : 33 m_process (), 34 m_stop_id (), 35 m_threads (), 36 m_threads_mutex (Mutex::eMutexTypeRecursive), 37 m_selected_tid () 38 { 39 // Use the assignment operator since it uses the mutex 40 *this = rhs; 41 } 42 43 const ThreadList& 44 ThreadList::operator = (const ThreadList& rhs) 45 { 46 if (this != &rhs) 47 { 48 // Lock both mutexes to make sure neither side changes anyone on us 49 // while the assignement occurs 50 Mutex::Locker locker_lhs(m_threads_mutex); 51 Mutex::Locker locker_rhs(rhs.m_threads_mutex); 52 m_process = rhs.m_process; 53 m_stop_id = rhs.m_stop_id; 54 m_threads = rhs.m_threads; 55 m_selected_tid = rhs.m_selected_tid; 56 } 57 return *this; 58 } 59 60 61 ThreadList::~ThreadList() 62 { 63 } 64 65 66 uint32_t 67 ThreadList::GetStopID () const 68 { 69 return m_stop_id; 70 } 71 72 void 73 ThreadList::SetStopID (uint32_t stop_id) 74 { 75 m_stop_id = stop_id; 76 } 77 78 79 void 80 ThreadList::AddThread (const ThreadSP &thread_sp) 81 { 82 Mutex::Locker locker(m_threads_mutex); 83 m_threads.push_back(thread_sp); 84 } 85 86 uint32_t 87 ThreadList::GetSize (bool can_update) 88 { 89 Mutex::Locker locker(m_threads_mutex); 90 if (can_update) 91 m_process->UpdateThreadListIfNeeded(); 92 return m_threads.size(); 93 } 94 95 ThreadSP 96 ThreadList::GetThreadAtIndex (uint32_t idx, bool can_update) 97 { 98 Mutex::Locker locker(m_threads_mutex); 99 if (can_update) 100 m_process->UpdateThreadListIfNeeded(); 101 102 ThreadSP thread_sp; 103 if (idx < m_threads.size()) 104 thread_sp = m_threads[idx]; 105 return thread_sp; 106 } 107 108 ThreadSP 109 ThreadList::FindThreadByID (lldb::tid_t tid, bool can_update) 110 { 111 Mutex::Locker locker(m_threads_mutex); 112 113 if (can_update) 114 m_process->UpdateThreadListIfNeeded(); 115 116 ThreadSP thread_sp; 117 uint32_t idx = 0; 118 const uint32_t num_threads = m_threads.size(); 119 for (idx = 0; idx < num_threads; ++idx) 120 { 121 if (m_threads[idx]->GetID() == tid) 122 { 123 thread_sp = m_threads[idx]; 124 break; 125 } 126 } 127 return thread_sp; 128 } 129 130 ThreadSP 131 ThreadList::GetThreadSPForThreadPtr (Thread *thread_ptr) 132 { 133 ThreadSP thread_sp; 134 if (thread_ptr) 135 { 136 Mutex::Locker locker(m_threads_mutex); 137 138 uint32_t idx = 0; 139 const uint32_t num_threads = m_threads.size(); 140 for (idx = 0; idx < num_threads; ++idx) 141 { 142 if (m_threads[idx].get() == thread_ptr) 143 { 144 thread_sp = m_threads[idx]; 145 break; 146 } 147 } 148 } 149 return thread_sp; 150 } 151 152 153 154 ThreadSP 155 ThreadList::FindThreadByIndexID (uint32_t index_id, bool can_update) 156 { 157 Mutex::Locker locker(m_threads_mutex); 158 159 if (can_update) 160 m_process->UpdateThreadListIfNeeded(); 161 162 ThreadSP thread_sp; 163 const uint32_t num_threads = m_threads.size(); 164 for (uint32_t idx = 0; idx < num_threads; ++idx) 165 { 166 if (m_threads[idx]->GetIndexID() == index_id) 167 { 168 thread_sp = m_threads[idx]; 169 break; 170 } 171 } 172 return thread_sp; 173 } 174 175 bool 176 ThreadList::ShouldStop (Event *event_ptr) 177 { 178 Mutex::Locker locker(m_threads_mutex); 179 180 // Running events should never stop, obviously... 181 182 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 183 184 bool should_stop = false; 185 m_process->UpdateThreadListIfNeeded(); 186 187 collection::iterator pos, end = m_threads.end(); 188 189 if (log) 190 { 191 log->PutCString(""); 192 log->Printf ("ThreadList::%s: %llu threads", __FUNCTION__, (uint64_t)m_threads.size()); 193 } 194 195 for (pos = m_threads.begin(); pos != end; ++pos) 196 { 197 ThreadSP thread_sp(*pos); 198 199 const bool thread_should_stop = thread_sp->ShouldStop(event_ptr); 200 if (thread_should_stop) 201 should_stop |= true; 202 } 203 204 if (log) 205 log->Printf ("ThreadList::%s overall should_stop = %i", __FUNCTION__, should_stop); 206 207 if (should_stop) 208 { 209 for (pos = m_threads.begin(); pos != end; ++pos) 210 { 211 ThreadSP thread_sp(*pos); 212 thread_sp->WillStop (); 213 } 214 } 215 216 return should_stop; 217 } 218 219 Vote 220 ThreadList::ShouldReportStop (Event *event_ptr) 221 { 222 Mutex::Locker locker(m_threads_mutex); 223 224 Vote result = eVoteNoOpinion; 225 m_process->UpdateThreadListIfNeeded(); 226 collection::iterator pos, end = m_threads.end(); 227 228 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 229 230 if (log) 231 log->Printf ("ThreadList::%s %llu threads", __FUNCTION__, (uint64_t)m_threads.size()); 232 233 // Run through the threads and ask whether we should report this event. 234 // For stopping, a YES vote wins over everything. A NO vote wins over NO opinion. 235 for (pos = m_threads.begin(); pos != end; ++pos) 236 { 237 ThreadSP thread_sp(*pos); 238 const Vote vote = thread_sp->ShouldReportStop (event_ptr); 239 switch (vote) 240 { 241 case eVoteNoOpinion: 242 continue; 243 244 case eVoteYes: 245 result = eVoteYes; 246 break; 247 248 case eVoteNo: 249 if (result == eVoteNoOpinion) 250 { 251 result = eVoteNo; 252 } 253 else 254 { 255 if (log) 256 log->Printf ("ThreadList::%s thread 0x%4.4llx: voted %s, but lost out because result was %s", 257 __FUNCTION__, 258 thread_sp->GetID (), 259 GetVoteAsCString (vote), 260 GetVoteAsCString (result)); 261 } 262 break; 263 } 264 } 265 if (log) 266 log->Printf ("ThreadList::%s returning %s", __FUNCTION__, GetVoteAsCString (result)); 267 return result; 268 } 269 270 Vote 271 ThreadList::ShouldReportRun (Event *event_ptr) 272 { 273 274 Mutex::Locker locker(m_threads_mutex); 275 276 Vote result = eVoteNoOpinion; 277 m_process->UpdateThreadListIfNeeded(); 278 collection::iterator pos, end = m_threads.end(); 279 280 // Run through the threads and ask whether we should report this event. 281 // The rule is NO vote wins over everything, a YES vote wins over no opinion. 282 283 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 284 285 for (pos = m_threads.begin(); pos != end; ++pos) 286 { 287 if ((*pos)->GetResumeState () != eStateSuspended) 288 { 289 switch ((*pos)->ShouldReportRun (event_ptr)) 290 { 291 case eVoteNoOpinion: 292 continue; 293 case eVoteYes: 294 if (result == eVoteNoOpinion) 295 result = eVoteYes; 296 break; 297 case eVoteNo: 298 if (log) 299 log->Printf ("ThreadList::ShouldReportRun() thread %d (0x%4.4llx) says don't report.", 300 (*pos)->GetIndexID(), 301 (*pos)->GetID()); 302 result = eVoteNo; 303 break; 304 } 305 } 306 } 307 return result; 308 } 309 310 void 311 ThreadList::Clear() 312 { 313 Mutex::Locker locker(m_threads_mutex); 314 m_stop_id = 0; 315 m_threads.clear(); 316 m_selected_tid = LLDB_INVALID_THREAD_ID; 317 } 318 319 void 320 ThreadList::Destroy() 321 { 322 Mutex::Locker locker(m_threads_mutex); 323 const uint32_t num_threads = m_threads.size(); 324 for (uint32_t idx = 0; idx < num_threads; ++idx) 325 { 326 m_threads[idx]->DestroyThread(); 327 } 328 } 329 330 void 331 ThreadList::RefreshStateAfterStop () 332 { 333 Mutex::Locker locker(m_threads_mutex); 334 335 m_process->UpdateThreadListIfNeeded(); 336 337 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 338 if (log && log->GetVerbose()) 339 log->Printf ("Turning off notification of new threads while single stepping a thread."); 340 341 collection::iterator pos, end = m_threads.end(); 342 for (pos = m_threads.begin(); pos != end; ++pos) 343 (*pos)->RefreshStateAfterStop (); 344 } 345 346 void 347 ThreadList::DiscardThreadPlans () 348 { 349 // You don't need to update the thread list here, because only threads 350 // that you currently know about have any thread plans. 351 Mutex::Locker locker(m_threads_mutex); 352 353 collection::iterator pos, end = m_threads.end(); 354 for (pos = m_threads.begin(); pos != end; ++pos) 355 (*pos)->DiscardThreadPlans (true); 356 357 } 358 359 bool 360 ThreadList::WillResume () 361 { 362 // Run through the threads and perform their momentary actions. 363 // But we only do this for threads that are running, user suspended 364 // threads stay where they are. 365 366 Mutex::Locker locker(m_threads_mutex); 367 m_process->UpdateThreadListIfNeeded(); 368 369 collection::iterator pos, end = m_threads.end(); 370 371 // See if any thread wants to run stopping others. If it does, then we won't 372 // setup the other threads for resume, since they aren't going to get a chance 373 // to run. This is necessary because the SetupForResume might add "StopOthers" 374 // plans which would then get to be part of the who-gets-to-run negotiation, but 375 // they're coming in after the fact, and the threads that are already set up should 376 // take priority. 377 378 bool wants_solo_run = false; 379 380 for (pos = m_threads.begin(); pos != end; ++pos) 381 { 382 if ((*pos)->GetResumeState() != eStateSuspended && 383 (*pos)->GetCurrentPlan()->StopOthers()) 384 { 385 wants_solo_run = true; 386 break; 387 } 388 } 389 390 if (wants_solo_run) 391 { 392 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 393 if (log && log->GetVerbose()) 394 log->Printf ("Turning on notification of new threads while single stepping a thread."); 395 m_process->StartNoticingNewThreads(); 396 } 397 else 398 { 399 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 400 if (log && log->GetVerbose()) 401 log->Printf ("Turning off notification of new threads while single stepping a thread."); 402 m_process->StopNoticingNewThreads(); 403 } 404 405 // Give all the threads that are likely to run a last chance to set up their state before we 406 // negotiate who is actually going to get a chance to run... 407 // Don't set to resume suspended threads, and if any thread wanted to stop others, only 408 // call setup on the threads that request StopOthers... 409 410 for (pos = m_threads.begin(); pos != end; ++pos) 411 { 412 if ((*pos)->GetResumeState() != eStateSuspended 413 && (!wants_solo_run || (*pos)->GetCurrentPlan()->StopOthers())) 414 { 415 (*pos)->SetupForResume (); 416 } 417 } 418 419 // Now go through the threads and see if any thread wants to run just itself. 420 // if so then pick one and run it. 421 422 ThreadList run_me_only_list (m_process); 423 424 run_me_only_list.SetStopID(m_process->GetStopID()); 425 426 ThreadSP immediate_thread_sp; 427 bool run_only_current_thread = false; 428 429 for (pos = m_threads.begin(); pos != end; ++pos) 430 { 431 ThreadSP thread_sp(*pos); 432 if (thread_sp->GetResumeState() != eStateSuspended && 433 thread_sp->GetCurrentPlan()->StopOthers()) 434 { 435 // You can't say "stop others" and also want yourself to be suspended. 436 assert (thread_sp->GetCurrentPlan()->RunState() != eStateSuspended); 437 438 if (thread_sp == GetSelectedThread()) 439 { 440 run_only_current_thread = true; 441 run_me_only_list.Clear(); 442 run_me_only_list.AddThread (thread_sp); 443 break; 444 } 445 446 run_me_only_list.AddThread (thread_sp); 447 } 448 449 } 450 451 bool need_to_resume = true; 452 453 if (immediate_thread_sp) 454 { 455 for (pos = m_threads.begin(); pos != end; ++pos) 456 { 457 ThreadSP thread_sp(*pos); 458 if (thread_sp.get() == immediate_thread_sp.get()) 459 thread_sp->WillResume(thread_sp->GetCurrentPlan()->RunState()); 460 else 461 thread_sp->WillResume (eStateSuspended); 462 } 463 } 464 else if (run_me_only_list.GetSize (false) == 0) 465 { 466 // Everybody runs as they wish: 467 for (pos = m_threads.begin(); pos != end; ++pos) 468 { 469 ThreadSP thread_sp(*pos); 470 StateType run_state; 471 if (thread_sp->GetResumeState() != eStateSuspended) 472 run_state = thread_sp->GetCurrentPlan()->RunState(); 473 else 474 run_state = eStateSuspended; 475 if (!thread_sp->WillResume(run_state)) 476 need_to_resume = false; 477 } 478 } 479 else 480 { 481 ThreadSP thread_to_run; 482 483 if (run_only_current_thread) 484 { 485 thread_to_run = GetSelectedThread(); 486 } 487 else if (run_me_only_list.GetSize (false) == 1) 488 { 489 thread_to_run = run_me_only_list.GetThreadAtIndex (0); 490 } 491 else 492 { 493 int random_thread = (int) 494 ((run_me_only_list.GetSize (false) * (double) rand ()) / (RAND_MAX + 1.0)); 495 thread_to_run = run_me_only_list.GetThreadAtIndex (random_thread); 496 } 497 498 for (pos = m_threads.begin(); pos != end; ++pos) 499 { 500 ThreadSP thread_sp(*pos); 501 if (thread_sp == thread_to_run) 502 { 503 if (!thread_sp->WillResume(thread_sp->GetCurrentPlan()->RunState())) 504 need_to_resume = false; 505 } 506 else 507 thread_sp->WillResume (eStateSuspended); 508 } 509 } 510 511 return need_to_resume; 512 } 513 514 void 515 ThreadList::DidResume () 516 { 517 Mutex::Locker locker(m_threads_mutex); 518 collection::iterator pos, end = m_threads.end(); 519 for (pos = m_threads.begin(); pos != end; ++pos) 520 { 521 // Don't clear out threads that aren't going to get a chance to run, rather 522 // leave their state for the next time around. 523 ThreadSP thread_sp(*pos); 524 if (thread_sp->GetResumeState() != eStateSuspended) 525 thread_sp->DidResume (); 526 } 527 } 528 529 ThreadSP 530 ThreadList::GetSelectedThread () 531 { 532 Mutex::Locker locker(m_threads_mutex); 533 ThreadSP thread_sp = FindThreadByID(m_selected_tid); 534 if (!thread_sp.get()) 535 { 536 if (m_threads.size() == 0) 537 return thread_sp; 538 m_selected_tid = m_threads[0]->GetID(); 539 thread_sp = m_threads[0]; 540 } 541 return thread_sp; 542 } 543 544 bool 545 ThreadList::SetSelectedThreadByID (lldb::tid_t tid) 546 { 547 Mutex::Locker locker(m_threads_mutex); 548 ThreadSP selected_thread_sp(FindThreadByID(tid)); 549 if (selected_thread_sp) 550 { 551 m_selected_tid = tid; 552 selected_thread_sp->SetDefaultFileAndLineToSelectedFrame(); 553 } 554 else 555 m_selected_tid = LLDB_INVALID_THREAD_ID; 556 557 return m_selected_tid != LLDB_INVALID_THREAD_ID; 558 } 559 560 bool 561 ThreadList::SetSelectedThreadByIndexID (uint32_t index_id) 562 { 563 Mutex::Locker locker(m_threads_mutex); 564 ThreadSP selected_thread_sp (FindThreadByIndexID(index_id)); 565 if (selected_thread_sp.get()) 566 { 567 m_selected_tid = selected_thread_sp->GetID(); 568 selected_thread_sp->SetDefaultFileAndLineToSelectedFrame(); 569 } 570 else 571 m_selected_tid = LLDB_INVALID_THREAD_ID; 572 573 return m_selected_tid != LLDB_INVALID_THREAD_ID; 574 } 575 576 void 577 ThreadList::Update (ThreadList &rhs) 578 { 579 if (this != &rhs) 580 { 581 // Lock both mutexes to make sure neither side changes anyone on us 582 // while the assignement occurs 583 Mutex::Locker locker_lhs(m_threads_mutex); 584 Mutex::Locker locker_rhs(rhs.m_threads_mutex); 585 m_process = rhs.m_process; 586 m_stop_id = rhs.m_stop_id; 587 m_threads.swap(rhs.m_threads); 588 m_selected_tid = rhs.m_selected_tid; 589 590 591 // Now we look for threads that we are done with and 592 // make sure to clear them up as much as possible so 593 // anyone with a shared pointer will still have a reference, 594 // but the thread won't be of much use. Using std::weak_ptr 595 // for all backward references (such as a thread to a process) 596 // will eventually solve this issue for us, but for now, we 597 // need to work around the issue 598 collection::iterator rhs_pos, rhs_end = rhs.m_threads.end(); 599 for (rhs_pos = rhs.m_threads.begin(); rhs_pos != rhs_end; ++rhs_pos) 600 { 601 const lldb::tid_t tid = (*rhs_pos)->GetID(); 602 bool thread_is_alive = false; 603 const uint32_t num_threads = m_threads.size(); 604 for (uint32_t idx = 0; idx < num_threads; ++idx) 605 { 606 if (m_threads[idx]->GetID() == tid) 607 { 608 thread_is_alive = true; 609 break; 610 } 611 } 612 if (!thread_is_alive) 613 (*rhs_pos)->DestroyThread(); 614 } 615 } 616 } 617 618 void 619 ThreadList::Flush () 620 { 621 Mutex::Locker locker(m_threads_mutex); 622 collection::iterator pos, end = m_threads.end(); 623 for (pos = m_threads.begin(); pos != end; ++pos) 624 (*pos)->Flush (); 625 } 626 627