• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
ThreadList()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 
~ThreadList()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 
Contains(Thread * thread)51 bool ThreadList::Contains(Thread* thread) {
52   return find(list_.begin(), list_.end(), thread) != list_.end();
53 }
54 
Contains(pid_t tid)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 
GetLockOwner()64 pid_t ThreadList::GetLockOwner() {
65   return Locks::thread_list_lock_->GetExclusiveOwnerTid();
66 }
67 
DumpForSigQuit(std::ostream & os)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 
DumpUnattachedThread(std::ostream & os,pid_t tid)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 
DumpUnattachedThreads(std::ostream & os)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 
DumpLocked(std::ostream & os)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 
AssertThreadsAreSuspended(Thread * self,Thread * ignore1,Thread * ignore2)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.
UnsafeLogFatalForThreadSuspendAllTimeout(Thread * self)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 
RunCheckpoint(Closure * checkpoint_function)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 
SuspendAll()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 
ResumeAll()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 
Resume(Thread * thread,bool for_debugger)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 
SuspendAllForDebugger()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 
SuspendSelfForDebugger()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 
UndoDebuggerSuspensions()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 
WaitForOtherNonDaemonThreadsToExit()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 
SuspendAllDaemonThreads()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 }
Register(Thread * self)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 
Unregister(Thread * self)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 
ForEach(void (* callback)(Thread *,void *),void * context)558 void ThreadList::ForEach(void (*callback)(Thread*, void*), void* context) {
559   for (const auto& thread : list_) {
560     callback(thread, context);
561   }
562 }
563 
VisitRoots(RootVisitor * visitor,void * arg) const564 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 
VerifyRoots(VerifyRootVisitor * visitor,void * arg) const571 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 
AllocThreadId(Thread * self)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 
ReleaseThreadId(Thread * self,uint32_t id)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 
FindThreadByThinLockId(uint32_t thin_lock_id)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