1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include "thread_list.h" 18 19 #include <dirent.h> 20 #include <sys/types.h> 21 #include <unistd.h> 22 23 #include "base/mutex.h" 24 #include "base/timing_logger.h" 25 #include "debugger.h" 26 #include "thread.h" 27 #include "utils.h" 28 29 namespace art { 30 31 ThreadList::ThreadList() 32 : allocated_ids_lock_("allocated thread ids lock"), 33 suspend_all_count_(0), debug_suspend_all_count_(0), 34 thread_exit_cond_("thread exit condition variable", *Locks::thread_list_lock_) { 35 } 36 37 ThreadList::~ThreadList() { 38 // Detach the current thread if necessary. If we failed to start, there might not be any threads. 39 // We need to detach the current thread here in case there's another thread waiting to join with 40 // us. 41 if (Contains(Thread::Current())) { 42 Runtime::Current()->DetachCurrentThread(); 43 } 44 45 WaitForOtherNonDaemonThreadsToExit(); 46 // TODO: there's an unaddressed race here where a thread may attach during shutdown, see 47 // Thread::Init. 48 SuspendAllDaemonThreads(); 49 } 50 51 bool ThreadList::Contains(Thread* thread) { 52 return find(list_.begin(), list_.end(), thread) != list_.end(); 53 } 54 55 bool ThreadList::Contains(pid_t tid) { 56 for (const auto& thread : list_) { 57 if (thread->tid_ == tid) { 58 return true; 59 } 60 } 61 return false; 62 } 63 64 pid_t ThreadList::GetLockOwner() { 65 return Locks::thread_list_lock_->GetExclusiveOwnerTid(); 66 } 67 68 void ThreadList::DumpForSigQuit(std::ostream& os) { 69 { 70 MutexLock mu(Thread::Current(), *Locks::thread_list_lock_); 71 DumpLocked(os); 72 } 73 DumpUnattachedThreads(os); 74 } 75 76 static void DumpUnattachedThread(std::ostream& os, pid_t tid) NO_THREAD_SAFETY_ANALYSIS { 77 // TODO: No thread safety analysis as DumpState with a NULL thread won't access fields, should 78 // refactor DumpState to avoid skipping analysis. 79 Thread::DumpState(os, NULL, tid); 80 DumpKernelStack(os, tid, " kernel: ", false); 81 // TODO: Reenable this when the native code in system_server can handle it. 82 // Currently "adb shell kill -3 `pid system_server`" will cause it to exit. 83 if (false) { 84 DumpNativeStack(os, tid, " native: ", false); 85 } 86 os << "\n"; 87 } 88 89 void ThreadList::DumpUnattachedThreads(std::ostream& os) { 90 DIR* d = opendir("/proc/self/task"); 91 if (!d) { 92 return; 93 } 94 95 Thread* self = Thread::Current(); 96 dirent* e; 97 while ((e = readdir(d)) != NULL) { 98 char* end; 99 pid_t tid = strtol(e->d_name, &end, 10); 100 if (!*end) { 101 bool contains; 102 { 103 MutexLock mu(self, *Locks::thread_list_lock_); 104 contains = Contains(tid); 105 } 106 if (!contains) { 107 DumpUnattachedThread(os, tid); 108 } 109 } 110 } 111 closedir(d); 112 } 113 114 void ThreadList::DumpLocked(std::ostream& os) { 115 os << "DALVIK THREADS (" << list_.size() << "):\n"; 116 for (const auto& thread : list_) { 117 thread->Dump(os); 118 os << "\n"; 119 } 120 } 121 122 void ThreadList::AssertThreadsAreSuspended(Thread* self, Thread* ignore1, Thread* ignore2) { 123 MutexLock mu(self, *Locks::thread_list_lock_); 124 MutexLock mu2(self, *Locks::thread_suspend_count_lock_); 125 for (const auto& thread : list_) { 126 if (thread != ignore1 && thread != ignore2) { 127 CHECK(thread->IsSuspended()) 128 << "\nUnsuspended thread: <<" << *thread << "\n" 129 << "self: <<" << *Thread::Current(); 130 } 131 } 132 } 133 134 #if HAVE_TIMED_RWLOCK 135 // Attempt to rectify locks so that we dump thread list with required locks before exiting. 136 static void UnsafeLogFatalForThreadSuspendAllTimeout(Thread* self) NO_THREAD_SAFETY_ANALYSIS { 137 Runtime* runtime = Runtime::Current(); 138 std::ostringstream ss; 139 ss << "Thread suspend timeout\n"; 140 runtime->DumpLockHolders(ss); 141 ss << "\n"; 142 runtime->GetThreadList()->DumpLocked(ss); 143 LOG(FATAL) << ss.str(); 144 } 145 #endif 146 147 size_t ThreadList::RunCheckpoint(Closure* checkpoint_function) { 148 Thread* self = Thread::Current(); 149 if (kIsDebugBuild) { 150 Locks::mutator_lock_->AssertNotExclusiveHeld(self); 151 Locks::thread_list_lock_->AssertNotHeld(self); 152 Locks::thread_suspend_count_lock_->AssertNotHeld(self); 153 CHECK_NE(self->GetState(), kRunnable); 154 } 155 156 std::vector<Thread*> suspended_count_modified_threads; 157 size_t count = 0; 158 { 159 // Call a checkpoint function for each thread, threads which are suspend get their checkpoint 160 // manually called. 161 MutexLock mu(self, *Locks::thread_list_lock_); 162 for (const auto& thread : list_) { 163 if (thread != self) { 164 for (;;) { 165 if (thread->RequestCheckpoint(checkpoint_function)) { 166 // This thread will run it's checkpoint some time in the near future. 167 count++; 168 break; 169 } else { 170 // We are probably suspended, try to make sure that we stay suspended. 171 MutexLock mu2(self, *Locks::thread_suspend_count_lock_); 172 // The thread switched back to runnable. 173 if (thread->GetState() == kRunnable) { 174 continue; 175 } 176 thread->ModifySuspendCount(self, +1, false); 177 suspended_count_modified_threads.push_back(thread); 178 break; 179 } 180 } 181 } 182 } 183 } 184 185 // Run the checkpoint on ourself while we wait for threads to suspend. 186 checkpoint_function->Run(self); 187 188 // Run the checkpoint on the suspended threads. 189 for (const auto& thread : suspended_count_modified_threads) { 190 if (!thread->IsSuspended()) { 191 // Wait until the thread is suspended. 192 uint64_t start = NanoTime(); 193 do { 194 // Sleep for 100us. 195 usleep(100); 196 } while (!thread->IsSuspended()); 197 uint64_t end = NanoTime(); 198 // Shouldn't need to wait for longer than 1 millisecond. 199 const uint64_t threshold = 1; 200 if (NsToMs(end - start) > threshold) { 201 LOG(INFO) << "Warning: waited longer than " << threshold 202 << " ms for thread suspend\n"; 203 } 204 } 205 // We know for sure that the thread is suspended at this point. 206 thread->RunCheckpointFunction(); 207 { 208 MutexLock mu2(self, *Locks::thread_suspend_count_lock_); 209 thread->ModifySuspendCount(self, -1, false); 210 } 211 } 212 213 { 214 // Imitate ResumeAll, threads may be waiting on Thread::resume_cond_ since we raised their 215 // suspend count. Now the suspend_count_ is lowered so we must do the broadcast. 216 MutexLock mu2(self, *Locks::thread_suspend_count_lock_); 217 Thread::resume_cond_->Broadcast(self); 218 } 219 220 // Add one for self. 221 return count + suspended_count_modified_threads.size() + 1; 222 } 223 224 void ThreadList::SuspendAll() { 225 Thread* self = Thread::Current(); 226 227 VLOG(threads) << *self << " SuspendAll starting..."; 228 229 if (kIsDebugBuild) { 230 Locks::mutator_lock_->AssertNotHeld(self); 231 Locks::thread_list_lock_->AssertNotHeld(self); 232 Locks::thread_suspend_count_lock_->AssertNotHeld(self); 233 CHECK_NE(self->GetState(), kRunnable); 234 } 235 { 236 MutexLock mu(self, *Locks::thread_list_lock_); 237 { 238 MutexLock mu2(self, *Locks::thread_suspend_count_lock_); 239 // Update global suspend all state for attaching threads. 240 ++suspend_all_count_; 241 // Increment everybody's suspend count (except our own). 242 for (const auto& thread : list_) { 243 if (thread == self) { 244 continue; 245 } 246 VLOG(threads) << "requesting thread suspend: " << *thread; 247 thread->ModifySuspendCount(self, +1, false); 248 } 249 } 250 } 251 252 // Block on the mutator lock until all Runnable threads release their share of access. 253 #if HAVE_TIMED_RWLOCK 254 // Timeout if we wait more than 30 seconds. 255 if (UNLIKELY(!Locks::mutator_lock_->ExclusiveLockWithTimeout(self, 30 * 1000, 0))) { 256 UnsafeLogFatalForThreadSuspendAllTimeout(self); 257 } 258 #else 259 Locks::mutator_lock_->ExclusiveLock(self); 260 #endif 261 262 // Debug check that all threads are suspended. 263 AssertThreadsAreSuspended(self, self); 264 265 VLOG(threads) << *self << " SuspendAll complete"; 266 } 267 268 void ThreadList::ResumeAll() { 269 Thread* self = Thread::Current(); 270 271 VLOG(threads) << *self << " ResumeAll starting"; 272 273 // Debug check that all threads are suspended. 274 AssertThreadsAreSuspended(self, self); 275 276 Locks::mutator_lock_->ExclusiveUnlock(self); 277 { 278 MutexLock mu(self, *Locks::thread_list_lock_); 279 MutexLock mu2(self, *Locks::thread_suspend_count_lock_); 280 // Update global suspend all state for attaching threads. 281 --suspend_all_count_; 282 // Decrement the suspend counts for all threads. 283 for (const auto& thread : list_) { 284 if (thread == self) { 285 continue; 286 } 287 thread->ModifySuspendCount(self, -1, false); 288 } 289 290 // Broadcast a notification to all suspended threads, some or all of 291 // which may choose to wake up. No need to wait for them. 292 VLOG(threads) << *self << " ResumeAll waking others"; 293 Thread::resume_cond_->Broadcast(self); 294 } 295 VLOG(threads) << *self << " ResumeAll complete"; 296 } 297 298 void ThreadList::Resume(Thread* thread, bool for_debugger) { 299 Thread* self = Thread::Current(); 300 DCHECK_NE(thread, self); 301 VLOG(threads) << "Resume(" << *thread << ") starting..." << (for_debugger ? " (debugger)" : ""); 302 303 { 304 // To check Contains. 305 MutexLock mu(self, *Locks::thread_list_lock_); 306 // To check IsSuspended. 307 MutexLock mu2(self, *Locks::thread_suspend_count_lock_); 308 DCHECK(thread->IsSuspended()); 309 if (!Contains(thread)) { 310 return; 311 } 312 thread->ModifySuspendCount(self, -1, for_debugger); 313 } 314 315 { 316 VLOG(threads) << "Resume(" << *thread << ") waking others"; 317 MutexLock mu(self, *Locks::thread_suspend_count_lock_); 318 Thread::resume_cond_->Broadcast(self); 319 } 320 321 VLOG(threads) << "Resume(" << *thread << ") complete"; 322 } 323 324 void ThreadList::SuspendAllForDebugger() { 325 Thread* self = Thread::Current(); 326 Thread* debug_thread = Dbg::GetDebugThread(); 327 328 VLOG(threads) << *self << " SuspendAllForDebugger starting..."; 329 330 { 331 MutexLock mu(self, *Locks::thread_list_lock_); 332 { 333 MutexLock mu(self, *Locks::thread_suspend_count_lock_); 334 // Update global suspend all state for attaching threads. 335 ++suspend_all_count_; 336 ++debug_suspend_all_count_; 337 // Increment everybody's suspend count (except our own). 338 for (const auto& thread : list_) { 339 if (thread == self || thread == debug_thread) { 340 continue; 341 } 342 VLOG(threads) << "requesting thread suspend: " << *thread; 343 thread->ModifySuspendCount(self, +1, true); 344 } 345 } 346 } 347 348 // Block on the mutator lock until all Runnable threads release their share of access then 349 // immediately unlock again. 350 #if HAVE_TIMED_RWLOCK 351 // Timeout if we wait more than 30 seconds. 352 if (!Locks::mutator_lock_->ExclusiveLockWithTimeout(self, 30 * 1000, 0)) { 353 UnsafeLogFatalForThreadSuspendAllTimeout(self); 354 } else { 355 Locks::mutator_lock_->ExclusiveUnlock(self); 356 } 357 #else 358 Locks::mutator_lock_->ExclusiveLock(self); 359 Locks::mutator_lock_->ExclusiveUnlock(self); 360 #endif 361 AssertThreadsAreSuspended(self, self, debug_thread); 362 363 VLOG(threads) << *self << " SuspendAll complete"; 364 } 365 366 void ThreadList::SuspendSelfForDebugger() { 367 Thread* self = Thread::Current(); 368 369 // The debugger thread must not suspend itself due to debugger activity! 370 Thread* debug_thread = Dbg::GetDebugThread(); 371 CHECK(debug_thread != NULL); 372 CHECK(self != debug_thread); 373 CHECK_NE(self->GetState(), kRunnable); 374 Locks::mutator_lock_->AssertNotHeld(self); 375 376 { 377 // Collisions with other suspends aren't really interesting. We want 378 // to ensure that we're the only one fiddling with the suspend count 379 // though. 380 MutexLock mu(self, *Locks::thread_suspend_count_lock_); 381 self->ModifySuspendCount(self, +1, true); 382 CHECK_GT(self->suspend_count_, 0); 383 } 384 385 VLOG(threads) << *self << " self-suspending (debugger)"; 386 387 // Tell JDWP that we've completed suspension. The JDWP thread can't 388 // tell us to resume before we're fully asleep because we hold the 389 // suspend count lock. 390 Dbg::ClearWaitForEventThread(); 391 392 { 393 MutexLock mu(self, *Locks::thread_suspend_count_lock_); 394 while (self->suspend_count_ != 0) { 395 Thread::resume_cond_->Wait(self); 396 if (self->suspend_count_ != 0) { 397 // The condition was signaled but we're still suspended. This 398 // can happen if the debugger lets go while a SIGQUIT thread 399 // dump event is pending (assuming SignalCatcher was resumed for 400 // just long enough to try to grab the thread-suspend lock). 401 LOG(DEBUG) << *self << " still suspended after undo " 402 << "(suspend count=" << self->suspend_count_ << ")"; 403 } 404 } 405 CHECK_EQ(self->suspend_count_, 0); 406 } 407 408 VLOG(threads) << *self << " self-reviving (debugger)"; 409 } 410 411 void ThreadList::UndoDebuggerSuspensions() { 412 Thread* self = Thread::Current(); 413 414 VLOG(threads) << *self << " UndoDebuggerSuspensions starting"; 415 416 { 417 MutexLock mu(self, *Locks::thread_list_lock_); 418 MutexLock mu2(self, *Locks::thread_suspend_count_lock_); 419 // Update global suspend all state for attaching threads. 420 suspend_all_count_ -= debug_suspend_all_count_; 421 debug_suspend_all_count_ = 0; 422 // Update running threads. 423 for (const auto& thread : list_) { 424 if (thread == self || thread->debug_suspend_count_ == 0) { 425 continue; 426 } 427 thread->ModifySuspendCount(self, -thread->debug_suspend_count_, true); 428 } 429 } 430 431 { 432 MutexLock mu(self, *Locks::thread_suspend_count_lock_); 433 Thread::resume_cond_->Broadcast(self); 434 } 435 436 VLOG(threads) << "UndoDebuggerSuspensions(" << *self << ") complete"; 437 } 438 439 void ThreadList::WaitForOtherNonDaemonThreadsToExit() { 440 Thread* self = Thread::Current(); 441 Locks::mutator_lock_->AssertNotHeld(self); 442 bool all_threads_are_daemons; 443 do { 444 { 445 // No more threads can be born after we start to shutdown. 446 MutexLock mu(self, *Locks::runtime_shutdown_lock_); 447 CHECK(Runtime::Current()->IsShuttingDown()); 448 CHECK_EQ(Runtime::Current()->NumberOfThreadsBeingBorn(), 0U); 449 } 450 all_threads_are_daemons = true; 451 MutexLock mu(self, *Locks::thread_list_lock_); 452 for (const auto& thread : list_) { 453 if (thread != self && !thread->IsDaemon()) { 454 all_threads_are_daemons = false; 455 break; 456 } 457 } 458 if (!all_threads_are_daemons) { 459 // Wait for another thread to exit before re-checking. 460 thread_exit_cond_.Wait(self); 461 } 462 } while (!all_threads_are_daemons); 463 } 464 465 void ThreadList::SuspendAllDaemonThreads() { 466 Thread* self = Thread::Current(); 467 MutexLock mu(self, *Locks::thread_list_lock_); 468 { // Tell all the daemons it's time to suspend. 469 MutexLock mu2(self, *Locks::thread_suspend_count_lock_); 470 for (const auto& thread : list_) { 471 // This is only run after all non-daemon threads have exited, so the remainder should all be 472 // daemons. 473 CHECK(thread->IsDaemon()) << *thread; 474 if (thread != self) { 475 thread->ModifySuspendCount(self, +1, false); 476 } 477 } 478 } 479 // Give the threads a chance to suspend, complaining if they're slow. 480 bool have_complained = false; 481 for (int i = 0; i < 10; ++i) { 482 usleep(200 * 1000); 483 bool all_suspended = true; 484 for (const auto& thread : list_) { 485 if (thread != self && thread->GetState() == kRunnable) { 486 if (!have_complained) { 487 LOG(WARNING) << "daemon thread not yet suspended: " << *thread; 488 have_complained = true; 489 } 490 all_suspended = false; 491 } 492 } 493 if (all_suspended) { 494 return; 495 } 496 } 497 LOG(ERROR) << "suspend all daemons failed"; 498 } 499 void ThreadList::Register(Thread* self) { 500 DCHECK_EQ(self, Thread::Current()); 501 502 if (VLOG_IS_ON(threads)) { 503 std::ostringstream oss; 504 self->ShortDump(oss); // We don't hold the mutator_lock_ yet and so cannot call Dump. 505 LOG(INFO) << "ThreadList::Register() " << *self << "\n" << oss; 506 } 507 508 // Atomically add self to the thread list and make its thread_suspend_count_ reflect ongoing 509 // SuspendAll requests. 510 MutexLock mu(self, *Locks::thread_list_lock_); 511 MutexLock mu2(self, *Locks::thread_suspend_count_lock_); 512 self->suspend_count_ = suspend_all_count_; 513 self->debug_suspend_count_ = debug_suspend_all_count_; 514 if (self->suspend_count_ > 0) { 515 self->AtomicSetFlag(kSuspendRequest); 516 } 517 CHECK(!Contains(self)); 518 list_.push_back(self); 519 } 520 521 void ThreadList::Unregister(Thread* self) { 522 DCHECK_EQ(self, Thread::Current()); 523 524 VLOG(threads) << "ThreadList::Unregister() " << *self; 525 526 // Any time-consuming destruction, plus anything that can call back into managed code or 527 // suspend and so on, must happen at this point, and not in ~Thread. 528 self->Destroy(); 529 530 uint32_t thin_lock_id = self->thin_lock_id_; 531 self->thin_lock_id_ = 0; 532 ReleaseThreadId(self, thin_lock_id); 533 while (self != NULL) { 534 // Remove and delete the Thread* while holding the thread_list_lock_ and 535 // thread_suspend_count_lock_ so that the unregistering thread cannot be suspended. 536 // Note: deliberately not using MutexLock that could hold a stale self pointer. 537 Locks::thread_list_lock_->ExclusiveLock(self); 538 CHECK(Contains(self)); 539 // Note: we don't take the thread_suspend_count_lock_ here as to be suspending a thread other 540 // than yourself you need to hold the thread_list_lock_ (see Thread::ModifySuspendCount). 541 if (!self->IsSuspended()) { 542 list_.remove(self); 543 delete self; 544 self = NULL; 545 } 546 Locks::thread_list_lock_->ExclusiveUnlock(self); 547 } 548 549 // Clear the TLS data, so that the underlying native thread is recognizably detached. 550 // (It may wish to reattach later.) 551 CHECK_PTHREAD_CALL(pthread_setspecific, (Thread::pthread_key_self_, NULL), "detach self"); 552 553 // Signal that a thread just detached. 554 MutexLock mu(NULL, *Locks::thread_list_lock_); 555 thread_exit_cond_.Signal(NULL); 556 } 557 558 void ThreadList::ForEach(void (*callback)(Thread*, void*), void* context) { 559 for (const auto& thread : list_) { 560 callback(thread, context); 561 } 562 } 563 564 void ThreadList::VisitRoots(RootVisitor* visitor, void* arg) const { 565 MutexLock mu(Thread::Current(), *Locks::thread_list_lock_); 566 for (const auto& thread : list_) { 567 thread->VisitRoots(visitor, arg); 568 } 569 } 570 571 void ThreadList::VerifyRoots(VerifyRootVisitor* visitor, void* arg) const { 572 MutexLock mu(Thread::Current(), *Locks::thread_list_lock_); 573 for (const auto& thread : list_) { 574 thread->VerifyRoots(visitor, arg); 575 } 576 } 577 578 uint32_t ThreadList::AllocThreadId(Thread* self) { 579 MutexLock mu(self, allocated_ids_lock_); 580 for (size_t i = 0; i < allocated_ids_.size(); ++i) { 581 if (!allocated_ids_[i]) { 582 allocated_ids_.set(i); 583 return i + 1; // Zero is reserved to mean "invalid". 584 } 585 } 586 LOG(FATAL) << "Out of internal thread ids"; 587 return 0; 588 } 589 590 void ThreadList::ReleaseThreadId(Thread* self, uint32_t id) { 591 MutexLock mu(self, allocated_ids_lock_); 592 --id; // Zero is reserved to mean "invalid". 593 DCHECK(allocated_ids_[id]) << id; 594 allocated_ids_.reset(id); 595 } 596 597 Thread* ThreadList::FindThreadByThinLockId(uint32_t thin_lock_id) { 598 MutexLock mu(Thread::Current(), *Locks::thread_list_lock_); 599 for (const auto& thread : list_) { 600 if (thread->GetThinLockId() == thin_lock_id) { 601 return thread; 602 } 603 } 604 return NULL; 605 } 606 607 } // namespace art 608