Home | History | Annotate | Download | only in runtime
      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