xref: /aosp_15_r20/art/runtime/thread_list.cc (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2011 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #include "thread_list.h"
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker #include <dirent.h>
20*795d594fSAndroid Build Coastguard Worker #include <nativehelper/scoped_local_ref.h>
21*795d594fSAndroid Build Coastguard Worker #include <nativehelper/scoped_utf_chars.h>
22*795d594fSAndroid Build Coastguard Worker #include <sys/resource.h>  // For getpriority()
23*795d594fSAndroid Build Coastguard Worker #include <sys/types.h>
24*795d594fSAndroid Build Coastguard Worker #include <unistd.h>
25*795d594fSAndroid Build Coastguard Worker 
26*795d594fSAndroid Build Coastguard Worker #include <map>
27*795d594fSAndroid Build Coastguard Worker #include <sstream>
28*795d594fSAndroid Build Coastguard Worker #include <tuple>
29*795d594fSAndroid Build Coastguard Worker #include <vector>
30*795d594fSAndroid Build Coastguard Worker 
31*795d594fSAndroid Build Coastguard Worker #include "android-base/stringprintf.h"
32*795d594fSAndroid Build Coastguard Worker #include "art_field-inl.h"
33*795d594fSAndroid Build Coastguard Worker #include "base/aborting.h"
34*795d594fSAndroid Build Coastguard Worker #include "base/histogram-inl.h"
35*795d594fSAndroid Build Coastguard Worker #include "base/mutex-inl.h"
36*795d594fSAndroid Build Coastguard Worker #include "base/systrace.h"
37*795d594fSAndroid Build Coastguard Worker #include "base/time_utils.h"
38*795d594fSAndroid Build Coastguard Worker #include "base/timing_logger.h"
39*795d594fSAndroid Build Coastguard Worker #include "debugger.h"
40*795d594fSAndroid Build Coastguard Worker #include "gc/collector/concurrent_copying.h"
41*795d594fSAndroid Build Coastguard Worker #include "gc/gc_pause_listener.h"
42*795d594fSAndroid Build Coastguard Worker #include "gc/heap.h"
43*795d594fSAndroid Build Coastguard Worker #include "gc/reference_processor.h"
44*795d594fSAndroid Build Coastguard Worker #include "gc_root.h"
45*795d594fSAndroid Build Coastguard Worker #include "jni/jni_internal.h"
46*795d594fSAndroid Build Coastguard Worker #include "lock_word.h"
47*795d594fSAndroid Build Coastguard Worker #include "mirror/string.h"
48*795d594fSAndroid Build Coastguard Worker #include "monitor.h"
49*795d594fSAndroid Build Coastguard Worker #include "native_stack_dump.h"
50*795d594fSAndroid Build Coastguard Worker #include "obj_ptr-inl.h"
51*795d594fSAndroid Build Coastguard Worker #include "scoped_thread_state_change-inl.h"
52*795d594fSAndroid Build Coastguard Worker #include "thread.h"
53*795d594fSAndroid Build Coastguard Worker #include "trace.h"
54*795d594fSAndroid Build Coastguard Worker #include "unwindstack/AndroidUnwinder.h"
55*795d594fSAndroid Build Coastguard Worker #include "well_known_classes.h"
56*795d594fSAndroid Build Coastguard Worker 
57*795d594fSAndroid Build Coastguard Worker #if ART_USE_FUTEXES
58*795d594fSAndroid Build Coastguard Worker #include <linux/futex.h>
59*795d594fSAndroid Build Coastguard Worker #include <sys/syscall.h>
60*795d594fSAndroid Build Coastguard Worker #endif  // ART_USE_FUTEXES
61*795d594fSAndroid Build Coastguard Worker 
62*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
63*795d594fSAndroid Build Coastguard Worker 
64*795d594fSAndroid Build Coastguard Worker using android::base::StringPrintf;
65*795d594fSAndroid Build Coastguard Worker 
66*795d594fSAndroid Build Coastguard Worker static constexpr uint64_t kLongThreadSuspendThreshold = MsToNs(5);
67*795d594fSAndroid Build Coastguard Worker 
68*795d594fSAndroid Build Coastguard Worker // Whether we should try to dump the native stack of unattached threads. See commit ed8b723 for
69*795d594fSAndroid Build Coastguard Worker // some history.
70*795d594fSAndroid Build Coastguard Worker static constexpr bool kDumpUnattachedThreadNativeStackForSigQuit = true;
71*795d594fSAndroid Build Coastguard Worker 
ThreadList(uint64_t thread_suspend_timeout_ns)72*795d594fSAndroid Build Coastguard Worker ThreadList::ThreadList(uint64_t thread_suspend_timeout_ns)
73*795d594fSAndroid Build Coastguard Worker     : suspend_all_count_(0),
74*795d594fSAndroid Build Coastguard Worker       unregistering_count_(0),
75*795d594fSAndroid Build Coastguard Worker       suspend_all_histogram_("suspend all histogram", 16, 64),
76*795d594fSAndroid Build Coastguard Worker       long_suspend_(false),
77*795d594fSAndroid Build Coastguard Worker       shut_down_(false),
78*795d594fSAndroid Build Coastguard Worker       thread_suspend_timeout_ns_(thread_suspend_timeout_ns),
79*795d594fSAndroid Build Coastguard Worker       empty_checkpoint_barrier_(new Barrier(0)) {
80*795d594fSAndroid Build Coastguard Worker   CHECK(Monitor::IsValidLockWord(LockWord::FromThinLockId(kMaxThreadId, 1, 0U)));
81*795d594fSAndroid Build Coastguard Worker }
82*795d594fSAndroid Build Coastguard Worker 
~ThreadList()83*795d594fSAndroid Build Coastguard Worker ThreadList::~ThreadList() {
84*795d594fSAndroid Build Coastguard Worker   CHECK(shut_down_);
85*795d594fSAndroid Build Coastguard Worker }
86*795d594fSAndroid Build Coastguard Worker 
ShutDown()87*795d594fSAndroid Build Coastguard Worker void ThreadList::ShutDown() {
88*795d594fSAndroid Build Coastguard Worker   ScopedTrace trace(__PRETTY_FUNCTION__);
89*795d594fSAndroid Build Coastguard Worker   // Detach the current thread if necessary. If we failed to start, there might not be any threads.
90*795d594fSAndroid Build Coastguard Worker   // We need to detach the current thread here in case there's another thread waiting to join with
91*795d594fSAndroid Build Coastguard Worker   // us.
92*795d594fSAndroid Build Coastguard Worker   bool contains = false;
93*795d594fSAndroid Build Coastguard Worker   Thread* self = Thread::Current();
94*795d594fSAndroid Build Coastguard Worker   {
95*795d594fSAndroid Build Coastguard Worker     MutexLock mu(self, *Locks::thread_list_lock_);
96*795d594fSAndroid Build Coastguard Worker     contains = Contains(self);
97*795d594fSAndroid Build Coastguard Worker   }
98*795d594fSAndroid Build Coastguard Worker   if (contains) {
99*795d594fSAndroid Build Coastguard Worker     Runtime::Current()->DetachCurrentThread();
100*795d594fSAndroid Build Coastguard Worker   }
101*795d594fSAndroid Build Coastguard Worker   WaitForOtherNonDaemonThreadsToExit();
102*795d594fSAndroid Build Coastguard Worker   // The only caller of this function, ~Runtime, has already disabled GC and
103*795d594fSAndroid Build Coastguard Worker   // ensured that the last GC is finished.
104*795d594fSAndroid Build Coastguard Worker   gc::Heap* const heap = Runtime::Current()->GetHeap();
105*795d594fSAndroid Build Coastguard Worker   CHECK(heap->IsGCDisabledForShutdown());
106*795d594fSAndroid Build Coastguard Worker 
107*795d594fSAndroid Build Coastguard Worker   // TODO: there's an unaddressed race here where a thread may attach during shutdown, see
108*795d594fSAndroid Build Coastguard Worker   //       Thread::Init.
109*795d594fSAndroid Build Coastguard Worker   SuspendAllDaemonThreadsForShutdown();
110*795d594fSAndroid Build Coastguard Worker 
111*795d594fSAndroid Build Coastguard Worker   shut_down_ = true;
112*795d594fSAndroid Build Coastguard Worker }
113*795d594fSAndroid Build Coastguard Worker 
Contains(Thread * thread)114*795d594fSAndroid Build Coastguard Worker bool ThreadList::Contains(Thread* thread) {
115*795d594fSAndroid Build Coastguard Worker   return find(list_.begin(), list_.end(), thread) != list_.end();
116*795d594fSAndroid Build Coastguard Worker }
117*795d594fSAndroid Build Coastguard Worker 
GetLockOwner()118*795d594fSAndroid Build Coastguard Worker pid_t ThreadList::GetLockOwner() {
119*795d594fSAndroid Build Coastguard Worker   return Locks::thread_list_lock_->GetExclusiveOwnerTid();
120*795d594fSAndroid Build Coastguard Worker }
121*795d594fSAndroid Build Coastguard Worker 
DumpNativeStacks(std::ostream & os)122*795d594fSAndroid Build Coastguard Worker void ThreadList::DumpNativeStacks(std::ostream& os) {
123*795d594fSAndroid Build Coastguard Worker   MutexLock mu(Thread::Current(), *Locks::thread_list_lock_);
124*795d594fSAndroid Build Coastguard Worker   unwindstack::AndroidLocalUnwinder unwinder;
125*795d594fSAndroid Build Coastguard Worker   for (const auto& thread : list_) {
126*795d594fSAndroid Build Coastguard Worker     os << "DUMPING THREAD " << thread->GetTid() << "\n";
127*795d594fSAndroid Build Coastguard Worker     DumpNativeStack(os, unwinder, thread->GetTid(), "\t");
128*795d594fSAndroid Build Coastguard Worker     os << "\n";
129*795d594fSAndroid Build Coastguard Worker   }
130*795d594fSAndroid Build Coastguard Worker }
131*795d594fSAndroid Build Coastguard Worker 
DumpForSigQuit(std::ostream & os)132*795d594fSAndroid Build Coastguard Worker void ThreadList::DumpForSigQuit(std::ostream& os) {
133*795d594fSAndroid Build Coastguard Worker   {
134*795d594fSAndroid Build Coastguard Worker     ScopedObjectAccess soa(Thread::Current());
135*795d594fSAndroid Build Coastguard Worker     // Only print if we have samples.
136*795d594fSAndroid Build Coastguard Worker     if (suspend_all_histogram_.SampleSize() > 0) {
137*795d594fSAndroid Build Coastguard Worker       Histogram<uint64_t>::CumulativeData data;
138*795d594fSAndroid Build Coastguard Worker       suspend_all_histogram_.CreateHistogram(&data);
139*795d594fSAndroid Build Coastguard Worker       suspend_all_histogram_.PrintConfidenceIntervals(os, 0.99, data);  // Dump time to suspend.
140*795d594fSAndroid Build Coastguard Worker     }
141*795d594fSAndroid Build Coastguard Worker   }
142*795d594fSAndroid Build Coastguard Worker   bool dump_native_stack = Runtime::Current()->GetDumpNativeStackOnSigQuit();
143*795d594fSAndroid Build Coastguard Worker   Dump(os, dump_native_stack);
144*795d594fSAndroid Build Coastguard Worker   DumpUnattachedThreads(os, dump_native_stack && kDumpUnattachedThreadNativeStackForSigQuit);
145*795d594fSAndroid Build Coastguard Worker }
146*795d594fSAndroid Build Coastguard Worker 
DumpUnattachedThread(std::ostream & os,pid_t tid,bool dump_native_stack)147*795d594fSAndroid Build Coastguard Worker static void DumpUnattachedThread(std::ostream& os, pid_t tid, bool dump_native_stack)
148*795d594fSAndroid Build Coastguard Worker     NO_THREAD_SAFETY_ANALYSIS {
149*795d594fSAndroid Build Coastguard Worker   // TODO: No thread safety analysis as DumpState with a null thread won't access fields, should
150*795d594fSAndroid Build Coastguard Worker   // refactor DumpState to avoid skipping analysis.
151*795d594fSAndroid Build Coastguard Worker   Thread::DumpState(os, nullptr, tid);
152*795d594fSAndroid Build Coastguard Worker   if (dump_native_stack) {
153*795d594fSAndroid Build Coastguard Worker     DumpNativeStack(os, tid, "  native: ");
154*795d594fSAndroid Build Coastguard Worker   }
155*795d594fSAndroid Build Coastguard Worker   os << std::endl;
156*795d594fSAndroid Build Coastguard Worker }
157*795d594fSAndroid Build Coastguard Worker 
DumpUnattachedThreads(std::ostream & os,bool dump_native_stack)158*795d594fSAndroid Build Coastguard Worker void ThreadList::DumpUnattachedThreads(std::ostream& os, bool dump_native_stack) {
159*795d594fSAndroid Build Coastguard Worker   DIR* d = opendir("/proc/self/task");
160*795d594fSAndroid Build Coastguard Worker   if (!d) {
161*795d594fSAndroid Build Coastguard Worker     return;
162*795d594fSAndroid Build Coastguard Worker   }
163*795d594fSAndroid Build Coastguard Worker 
164*795d594fSAndroid Build Coastguard Worker   Thread* self = Thread::Current();
165*795d594fSAndroid Build Coastguard Worker   dirent* e;
166*795d594fSAndroid Build Coastguard Worker   while ((e = readdir(d)) != nullptr) {
167*795d594fSAndroid Build Coastguard Worker     char* end;
168*795d594fSAndroid Build Coastguard Worker     pid_t tid = strtol(e->d_name, &end, 10);
169*795d594fSAndroid Build Coastguard Worker     if (!*end) {
170*795d594fSAndroid Build Coastguard Worker       Thread* thread;
171*795d594fSAndroid Build Coastguard Worker       {
172*795d594fSAndroid Build Coastguard Worker         MutexLock mu(self, *Locks::thread_list_lock_);
173*795d594fSAndroid Build Coastguard Worker         thread = FindThreadByTid(tid);
174*795d594fSAndroid Build Coastguard Worker       }
175*795d594fSAndroid Build Coastguard Worker       if (thread == nullptr) {
176*795d594fSAndroid Build Coastguard Worker         DumpUnattachedThread(os, tid, dump_native_stack);
177*795d594fSAndroid Build Coastguard Worker       }
178*795d594fSAndroid Build Coastguard Worker     }
179*795d594fSAndroid Build Coastguard Worker   }
180*795d594fSAndroid Build Coastguard Worker   closedir(d);
181*795d594fSAndroid Build Coastguard Worker }
182*795d594fSAndroid Build Coastguard Worker 
183*795d594fSAndroid Build Coastguard Worker // Dump checkpoint timeout in milliseconds. Larger amount on the target, since the device could be
184*795d594fSAndroid Build Coastguard Worker // overloaded with ANR dumps.
185*795d594fSAndroid Build Coastguard Worker static constexpr uint32_t kDumpWaitTimeout = kIsTargetBuild ? 100000 : 20000;
186*795d594fSAndroid Build Coastguard Worker 
187*795d594fSAndroid Build Coastguard Worker // A closure used by Thread::Dump.
188*795d594fSAndroid Build Coastguard Worker class DumpCheckpoint final : public Closure {
189*795d594fSAndroid Build Coastguard Worker  public:
DumpCheckpoint(bool dump_native_stack)190*795d594fSAndroid Build Coastguard Worker   DumpCheckpoint(bool dump_native_stack)
191*795d594fSAndroid Build Coastguard Worker       : lock_("Dump checkpoint lock", kGenericBottomLock),
192*795d594fSAndroid Build Coastguard Worker         os_(),
193*795d594fSAndroid Build Coastguard Worker         // Avoid verifying count in case a thread doesn't end up passing through the barrier.
194*795d594fSAndroid Build Coastguard Worker         // This avoids a SIGABRT that would otherwise happen in the destructor.
195*795d594fSAndroid Build Coastguard Worker         barrier_(0, /*verify_count_on_shutdown=*/false),
196*795d594fSAndroid Build Coastguard Worker         unwinder_(std::vector<std::string>{}, std::vector<std::string> {"oat", "odex"}),
197*795d594fSAndroid Build Coastguard Worker         dump_native_stack_(dump_native_stack) {
198*795d594fSAndroid Build Coastguard Worker   }
199*795d594fSAndroid Build Coastguard Worker 
Run(Thread * thread)200*795d594fSAndroid Build Coastguard Worker   void Run(Thread* thread) override {
201*795d594fSAndroid Build Coastguard Worker     // Note thread and self may not be equal if thread was already suspended at the point of the
202*795d594fSAndroid Build Coastguard Worker     // request.
203*795d594fSAndroid Build Coastguard Worker     Thread* self = Thread::Current();
204*795d594fSAndroid Build Coastguard Worker     CHECK(self != nullptr);
205*795d594fSAndroid Build Coastguard Worker     std::ostringstream local_os;
206*795d594fSAndroid Build Coastguard Worker     Locks::mutator_lock_->AssertSharedHeld(self);
207*795d594fSAndroid Build Coastguard Worker     Thread::DumpOrder dump_order = thread->Dump(local_os, unwinder_, dump_native_stack_);
208*795d594fSAndroid Build Coastguard Worker     {
209*795d594fSAndroid Build Coastguard Worker       MutexLock mu(self, lock_);
210*795d594fSAndroid Build Coastguard Worker       // Sort, so that the most interesting threads for ANR are printed first (ANRs can be trimmed).
211*795d594fSAndroid Build Coastguard Worker       std::pair<Thread::DumpOrder, uint32_t> sort_key(dump_order, thread->GetThreadId());
212*795d594fSAndroid Build Coastguard Worker       os_.emplace(sort_key, std::move(local_os));
213*795d594fSAndroid Build Coastguard Worker     }
214*795d594fSAndroid Build Coastguard Worker     barrier_.Pass(self);
215*795d594fSAndroid Build Coastguard Worker   }
216*795d594fSAndroid Build Coastguard Worker 
217*795d594fSAndroid Build Coastguard Worker   // Called at the end to print all the dumps in sequential prioritized order.
Dump(Thread * self,std::ostream & os)218*795d594fSAndroid Build Coastguard Worker   void Dump(Thread* self, std::ostream& os) {
219*795d594fSAndroid Build Coastguard Worker     MutexLock mu(self, lock_);
220*795d594fSAndroid Build Coastguard Worker     for (const auto& it : os_) {
221*795d594fSAndroid Build Coastguard Worker       os << it.second.str() << std::endl;
222*795d594fSAndroid Build Coastguard Worker     }
223*795d594fSAndroid Build Coastguard Worker   }
224*795d594fSAndroid Build Coastguard Worker 
WaitForThreadsToRunThroughCheckpoint(size_t threads_running_checkpoint)225*795d594fSAndroid Build Coastguard Worker   void WaitForThreadsToRunThroughCheckpoint(size_t threads_running_checkpoint) {
226*795d594fSAndroid Build Coastguard Worker     Thread* self = Thread::Current();
227*795d594fSAndroid Build Coastguard Worker     ScopedThreadStateChange tsc(self, ThreadState::kWaitingForCheckPointsToRun);
228*795d594fSAndroid Build Coastguard Worker     bool timed_out = barrier_.Increment(self, threads_running_checkpoint, kDumpWaitTimeout);
229*795d594fSAndroid Build Coastguard Worker     if (timed_out) {
230*795d594fSAndroid Build Coastguard Worker       // Avoid a recursive abort.
231*795d594fSAndroid Build Coastguard Worker       LOG((kIsDebugBuild && (gAborting == 0)) ? ::android::base::FATAL : ::android::base::ERROR)
232*795d594fSAndroid Build Coastguard Worker           << "Unexpected time out during dump checkpoint.";
233*795d594fSAndroid Build Coastguard Worker     }
234*795d594fSAndroid Build Coastguard Worker   }
235*795d594fSAndroid Build Coastguard Worker 
236*795d594fSAndroid Build Coastguard Worker  private:
237*795d594fSAndroid Build Coastguard Worker   // Storage for the per-thread dumps (guarded by lock since they are generated in parallel).
238*795d594fSAndroid Build Coastguard Worker   // Map is used to obtain sorted order. The key is unique, but use multimap just in case.
239*795d594fSAndroid Build Coastguard Worker   Mutex lock_;
240*795d594fSAndroid Build Coastguard Worker   std::multimap<std::pair<Thread::DumpOrder, uint32_t>, std::ostringstream> os_ GUARDED_BY(lock_);
241*795d594fSAndroid Build Coastguard Worker   // The barrier to be passed through and for the requestor to wait upon.
242*795d594fSAndroid Build Coastguard Worker   Barrier barrier_;
243*795d594fSAndroid Build Coastguard Worker   // A backtrace map, so that all threads use a shared info and don't reacquire/parse separately.
244*795d594fSAndroid Build Coastguard Worker   unwindstack::AndroidLocalUnwinder unwinder_;
245*795d594fSAndroid Build Coastguard Worker   // Whether we should dump the native stack.
246*795d594fSAndroid Build Coastguard Worker   const bool dump_native_stack_;
247*795d594fSAndroid Build Coastguard Worker };
248*795d594fSAndroid Build Coastguard Worker 
Dump(std::ostream & os,bool dump_native_stack)249*795d594fSAndroid Build Coastguard Worker void ThreadList::Dump(std::ostream& os, bool dump_native_stack) {
250*795d594fSAndroid Build Coastguard Worker   Thread* self = Thread::Current();
251*795d594fSAndroid Build Coastguard Worker   {
252*795d594fSAndroid Build Coastguard Worker     MutexLock mu(self, *Locks::thread_list_lock_);
253*795d594fSAndroid Build Coastguard Worker     os << "DALVIK THREADS (" << list_.size() << "):\n";
254*795d594fSAndroid Build Coastguard Worker   }
255*795d594fSAndroid Build Coastguard Worker   if (self != nullptr) {
256*795d594fSAndroid Build Coastguard Worker     DumpCheckpoint checkpoint(dump_native_stack);
257*795d594fSAndroid Build Coastguard Worker     // Acquire mutator lock separately for each thread, to avoid long runnable code sequence
258*795d594fSAndroid Build Coastguard Worker     // without suspend checks.
259*795d594fSAndroid Build Coastguard Worker     size_t threads_running_checkpoint = RunCheckpoint(&checkpoint,
260*795d594fSAndroid Build Coastguard Worker                                                       nullptr,
261*795d594fSAndroid Build Coastguard Worker                                                       true,
262*795d594fSAndroid Build Coastguard Worker                                                       /* acquire_mutator_lock= */ true);
263*795d594fSAndroid Build Coastguard Worker     if (threads_running_checkpoint != 0) {
264*795d594fSAndroid Build Coastguard Worker       checkpoint.WaitForThreadsToRunThroughCheckpoint(threads_running_checkpoint);
265*795d594fSAndroid Build Coastguard Worker     }
266*795d594fSAndroid Build Coastguard Worker     checkpoint.Dump(self, os);
267*795d594fSAndroid Build Coastguard Worker   } else {
268*795d594fSAndroid Build Coastguard Worker     DumpUnattachedThreads(os, dump_native_stack);
269*795d594fSAndroid Build Coastguard Worker   }
270*795d594fSAndroid Build Coastguard Worker }
271*795d594fSAndroid Build Coastguard Worker 
AssertOtherThreadsAreSuspended(Thread * self)272*795d594fSAndroid Build Coastguard Worker void ThreadList::AssertOtherThreadsAreSuspended(Thread* self) {
273*795d594fSAndroid Build Coastguard Worker   MutexLock mu(self, *Locks::thread_list_lock_);
274*795d594fSAndroid Build Coastguard Worker   MutexLock mu2(self, *Locks::thread_suspend_count_lock_);
275*795d594fSAndroid Build Coastguard Worker   for (const auto& thread : list_) {
276*795d594fSAndroid Build Coastguard Worker     if (thread != self) {
277*795d594fSAndroid Build Coastguard Worker       CHECK(thread->IsSuspended())
278*795d594fSAndroid Build Coastguard Worker             << "\nUnsuspended thread: <<" << *thread << "\n"
279*795d594fSAndroid Build Coastguard Worker             << "self: <<" << *Thread::Current();
280*795d594fSAndroid Build Coastguard Worker     }
281*795d594fSAndroid Build Coastguard Worker   }
282*795d594fSAndroid Build Coastguard Worker }
283*795d594fSAndroid Build Coastguard Worker 
284*795d594fSAndroid Build Coastguard Worker #if HAVE_TIMED_RWLOCK
285*795d594fSAndroid Build Coastguard Worker // Attempt to rectify locks so that we dump thread list with required locks before exiting.
UnsafeLogFatalForThreadSuspendAllTimeout()286*795d594fSAndroid Build Coastguard Worker NO_RETURN static void UnsafeLogFatalForThreadSuspendAllTimeout() {
287*795d594fSAndroid Build Coastguard Worker   // Increment gAborting before doing the thread list dump since we don't want any failures from
288*795d594fSAndroid Build Coastguard Worker   // AssertThreadSuspensionIsAllowable in cases where thread suspension is not allowed.
289*795d594fSAndroid Build Coastguard Worker   // See b/69044468.
290*795d594fSAndroid Build Coastguard Worker   ++gAborting;
291*795d594fSAndroid Build Coastguard Worker   Runtime* runtime = Runtime::Current();
292*795d594fSAndroid Build Coastguard Worker   std::ostringstream ss;
293*795d594fSAndroid Build Coastguard Worker   ss << "Thread suspend timeout\n";
294*795d594fSAndroid Build Coastguard Worker   Locks::mutator_lock_->Dump(ss);
295*795d594fSAndroid Build Coastguard Worker   ss << "\n";
296*795d594fSAndroid Build Coastguard Worker   runtime->GetThreadList()->Dump(ss);
297*795d594fSAndroid Build Coastguard Worker   --gAborting;
298*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << ss.str();
299*795d594fSAndroid Build Coastguard Worker   exit(0);
300*795d594fSAndroid Build Coastguard Worker }
301*795d594fSAndroid Build Coastguard Worker #endif
302*795d594fSAndroid Build Coastguard Worker 
RunCheckpoint(Closure * checkpoint_function,Closure * callback,bool allow_lock_checking,bool acquire_mutator_lock)303*795d594fSAndroid Build Coastguard Worker size_t ThreadList::RunCheckpoint(Closure* checkpoint_function,
304*795d594fSAndroid Build Coastguard Worker                                  Closure* callback,
305*795d594fSAndroid Build Coastguard Worker                                  bool allow_lock_checking,
306*795d594fSAndroid Build Coastguard Worker                                  bool acquire_mutator_lock) {
307*795d594fSAndroid Build Coastguard Worker   Thread* self = Thread::Current();
308*795d594fSAndroid Build Coastguard Worker   Locks::mutator_lock_->AssertNotExclusiveHeld(self);
309*795d594fSAndroid Build Coastguard Worker   Locks::thread_list_lock_->AssertNotHeld(self);
310*795d594fSAndroid Build Coastguard Worker   Locks::thread_suspend_count_lock_->AssertNotHeld(self);
311*795d594fSAndroid Build Coastguard Worker   if (kIsDebugBuild && allow_lock_checking && !acquire_mutator_lock) {
312*795d594fSAndroid Build Coastguard Worker     // TODO: Consider better checking with acquire_mutator_lock.
313*795d594fSAndroid Build Coastguard Worker     self->DisallowPreMonitorMutexes();
314*795d594fSAndroid Build Coastguard Worker   }
315*795d594fSAndroid Build Coastguard Worker 
316*795d594fSAndroid Build Coastguard Worker   std::vector<Thread*> remaining_threads;
317*795d594fSAndroid Build Coastguard Worker   size_t count = 0;
318*795d594fSAndroid Build Coastguard Worker   bool mutator_lock_held = Locks::mutator_lock_->IsSharedHeld(self);
319*795d594fSAndroid Build Coastguard Worker   ThreadState old_thread_state = self->GetState();
320*795d594fSAndroid Build Coastguard Worker   DCHECK(!(mutator_lock_held && acquire_mutator_lock));
321*795d594fSAndroid Build Coastguard Worker 
322*795d594fSAndroid Build Coastguard Worker   // Thread-safety analysis wants the lock state to always be the same at every program point.
323*795d594fSAndroid Build Coastguard Worker   // Allow us to pretend it is.
324*795d594fSAndroid Build Coastguard Worker   auto fake_mutator_lock = []() SHARED_LOCK_FUNCTION(Locks::mutator_lock_)
325*795d594fSAndroid Build Coastguard Worker                                NO_THREAD_SAFETY_ANALYSIS {};
326*795d594fSAndroid Build Coastguard Worker   auto fake_mutator_unlock = []() UNLOCK_FUNCTION(Locks::mutator_lock_)
327*795d594fSAndroid Build Coastguard Worker                                  NO_THREAD_SAFETY_ANALYSIS {};
328*795d594fSAndroid Build Coastguard Worker 
329*795d594fSAndroid Build Coastguard Worker   if (acquire_mutator_lock) {
330*795d594fSAndroid Build Coastguard Worker     self->TransitionFromSuspendedToRunnable();
331*795d594fSAndroid Build Coastguard Worker   } else {
332*795d594fSAndroid Build Coastguard Worker     fake_mutator_lock();
333*795d594fSAndroid Build Coastguard Worker   }
334*795d594fSAndroid Build Coastguard Worker   Locks::thread_list_lock_->Lock(self);
335*795d594fSAndroid Build Coastguard Worker   Locks::thread_suspend_count_lock_->Lock(self);
336*795d594fSAndroid Build Coastguard Worker 
337*795d594fSAndroid Build Coastguard Worker   // First try to install checkpoint function in each thread. This will succeed only for
338*795d594fSAndroid Build Coastguard Worker   // runnable threads. Track others in remaining_threads.
339*795d594fSAndroid Build Coastguard Worker   count = list_.size();
340*795d594fSAndroid Build Coastguard Worker   for (const auto& thread : list_) {
341*795d594fSAndroid Build Coastguard Worker     if (thread != self) {
342*795d594fSAndroid Build Coastguard Worker       if (thread->RequestCheckpoint(checkpoint_function)) {
343*795d594fSAndroid Build Coastguard Worker         // This thread will run its checkpoint some time in the near future.
344*795d594fSAndroid Build Coastguard Worker       } else {
345*795d594fSAndroid Build Coastguard Worker         remaining_threads.push_back(thread);
346*795d594fSAndroid Build Coastguard Worker       }
347*795d594fSAndroid Build Coastguard Worker     }
348*795d594fSAndroid Build Coastguard Worker     // Thread either has honored or will honor the checkpoint, or it has been added to
349*795d594fSAndroid Build Coastguard Worker     // remaining_threads.
350*795d594fSAndroid Build Coastguard Worker   }
351*795d594fSAndroid Build Coastguard Worker 
352*795d594fSAndroid Build Coastguard Worker   // ith entry corresponds to remaining_threads[i]:
353*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ThreadExitFlag[]> tefs(new ThreadExitFlag[remaining_threads.size()]);
354*795d594fSAndroid Build Coastguard Worker 
355*795d594fSAndroid Build Coastguard Worker   // Register a ThreadExitFlag for each remaining thread.
356*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < remaining_threads.size(); ++i) {
357*795d594fSAndroid Build Coastguard Worker     remaining_threads[i]->NotifyOnThreadExit(&tefs[i]);
358*795d594fSAndroid Build Coastguard Worker   }
359*795d594fSAndroid Build Coastguard Worker 
360*795d594fSAndroid Build Coastguard Worker   // Run the callback to be called inside this critical section.
361*795d594fSAndroid Build Coastguard Worker   if (callback != nullptr) {
362*795d594fSAndroid Build Coastguard Worker     callback->Run(self);
363*795d594fSAndroid Build Coastguard Worker   }
364*795d594fSAndroid Build Coastguard Worker 
365*795d594fSAndroid Build Coastguard Worker   size_t nthreads = remaining_threads.size();
366*795d594fSAndroid Build Coastguard Worker   size_t starting_thread = 0;
367*795d594fSAndroid Build Coastguard Worker   size_t next_starting_thread;  // First possible remaining non-null entry in remaining_threads.
368*795d594fSAndroid Build Coastguard Worker   // Run the checkpoint for the suspended threads.
369*795d594fSAndroid Build Coastguard Worker   do {
370*795d594fSAndroid Build Coastguard Worker     // We hold mutator_lock_ (if desired), thread_list_lock_, and suspend_count_lock_
371*795d594fSAndroid Build Coastguard Worker     next_starting_thread = nthreads;
372*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0; i < nthreads; ++i) {
373*795d594fSAndroid Build Coastguard Worker       Thread* thread = remaining_threads[i];
374*795d594fSAndroid Build Coastguard Worker       if (thread == nullptr) {
375*795d594fSAndroid Build Coastguard Worker         continue;
376*795d594fSAndroid Build Coastguard Worker       }
377*795d594fSAndroid Build Coastguard Worker       if (tefs[i].HasExited()) {
378*795d594fSAndroid Build Coastguard Worker         remaining_threads[i] = nullptr;
379*795d594fSAndroid Build Coastguard Worker         --count;
380*795d594fSAndroid Build Coastguard Worker         continue;
381*795d594fSAndroid Build Coastguard Worker       }
382*795d594fSAndroid Build Coastguard Worker       bool was_runnable = thread->RequestCheckpoint(checkpoint_function);
383*795d594fSAndroid Build Coastguard Worker       if (was_runnable) {
384*795d594fSAndroid Build Coastguard Worker         // Thread became runnable, and will run the checkpoint; we're done.
385*795d594fSAndroid Build Coastguard Worker         thread->UnregisterThreadExitFlag(&tefs[i]);
386*795d594fSAndroid Build Coastguard Worker         remaining_threads[i] = nullptr;
387*795d594fSAndroid Build Coastguard Worker         continue;
388*795d594fSAndroid Build Coastguard Worker       }
389*795d594fSAndroid Build Coastguard Worker       // Thread was still suspended, as expected.
390*795d594fSAndroid Build Coastguard Worker       // We need to run the checkpoint ourselves. Suspend thread so it stays suspended.
391*795d594fSAndroid Build Coastguard Worker       thread->IncrementSuspendCount(self);
392*795d594fSAndroid Build Coastguard Worker       if (LIKELY(thread->IsSuspended())) {
393*795d594fSAndroid Build Coastguard Worker         // Run the checkpoint function ourselves.
394*795d594fSAndroid Build Coastguard Worker         // We need to run the checkpoint function without the thread_list and suspend_count locks.
395*795d594fSAndroid Build Coastguard Worker         Locks::thread_suspend_count_lock_->Unlock(self);
396*795d594fSAndroid Build Coastguard Worker         Locks::thread_list_lock_->Unlock(self);
397*795d594fSAndroid Build Coastguard Worker         if (mutator_lock_held || acquire_mutator_lock) {
398*795d594fSAndroid Build Coastguard Worker           // Make sure there is no pending flip function before running Java-heap-accessing
399*795d594fSAndroid Build Coastguard Worker           // checkpoint on behalf of thread.
400*795d594fSAndroid Build Coastguard Worker           Thread::EnsureFlipFunctionStarted(self, thread);
401*795d594fSAndroid Build Coastguard Worker           if (thread->GetStateAndFlags(std::memory_order_acquire)
402*795d594fSAndroid Build Coastguard Worker                   .IsAnyOfFlagsSet(Thread::FlipFunctionFlags())) {
403*795d594fSAndroid Build Coastguard Worker             // There is another thread running the flip function for 'thread'.
404*795d594fSAndroid Build Coastguard Worker             // Instead of waiting for it to complete, move to the next thread.
405*795d594fSAndroid Build Coastguard Worker             // Retry this one later from scratch.
406*795d594fSAndroid Build Coastguard Worker             next_starting_thread = std::min(next_starting_thread, i);
407*795d594fSAndroid Build Coastguard Worker             Locks::thread_list_lock_->Lock(self);
408*795d594fSAndroid Build Coastguard Worker             Locks::thread_suspend_count_lock_->Lock(self);
409*795d594fSAndroid Build Coastguard Worker             thread->DecrementSuspendCount(self);
410*795d594fSAndroid Build Coastguard Worker             Thread::resume_cond_->Broadcast(self);
411*795d594fSAndroid Build Coastguard Worker             continue;
412*795d594fSAndroid Build Coastguard Worker           }
413*795d594fSAndroid Build Coastguard Worker         }  // O.w. the checkpoint will not access Java data structures, and doesn't care whether
414*795d594fSAndroid Build Coastguard Worker            // the flip function has been called.
415*795d594fSAndroid Build Coastguard Worker         checkpoint_function->Run(thread);
416*795d594fSAndroid Build Coastguard Worker         if (acquire_mutator_lock) {
417*795d594fSAndroid Build Coastguard Worker           {
418*795d594fSAndroid Build Coastguard Worker             MutexLock mu3(self, *Locks::thread_suspend_count_lock_);
419*795d594fSAndroid Build Coastguard Worker             thread->DecrementSuspendCount(self);
420*795d594fSAndroid Build Coastguard Worker             // In the case of a thread waiting for IO or the like, there will be no waiters
421*795d594fSAndroid Build Coastguard Worker             // on resume_cond_, so Broadcast() will not enter the kernel, and thus be cheap.
422*795d594fSAndroid Build Coastguard Worker             Thread::resume_cond_->Broadcast(self);
423*795d594fSAndroid Build Coastguard Worker           }
424*795d594fSAndroid Build Coastguard Worker           {
425*795d594fSAndroid Build Coastguard Worker             // Allow us to run checkpoints, or be suspended between checkpoint invocations.
426*795d594fSAndroid Build Coastguard Worker             ScopedThreadSuspension sts(self, old_thread_state);
427*795d594fSAndroid Build Coastguard Worker           }
428*795d594fSAndroid Build Coastguard Worker           Locks::thread_list_lock_->Lock(self);
429*795d594fSAndroid Build Coastguard Worker           Locks::thread_suspend_count_lock_->Lock(self);
430*795d594fSAndroid Build Coastguard Worker         } else {
431*795d594fSAndroid Build Coastguard Worker           Locks::thread_list_lock_->Lock(self);
432*795d594fSAndroid Build Coastguard Worker           Locks::thread_suspend_count_lock_->Lock(self);
433*795d594fSAndroid Build Coastguard Worker           thread->DecrementSuspendCount(self);
434*795d594fSAndroid Build Coastguard Worker           Thread::resume_cond_->Broadcast(self);
435*795d594fSAndroid Build Coastguard Worker         }
436*795d594fSAndroid Build Coastguard Worker         thread->UnregisterThreadExitFlag(&tefs[i]);
437*795d594fSAndroid Build Coastguard Worker         remaining_threads[i] = nullptr;
438*795d594fSAndroid Build Coastguard Worker       } else {
439*795d594fSAndroid Build Coastguard Worker         // Thread may have become runnable between the time we last checked and
440*795d594fSAndroid Build Coastguard Worker         // the time we incremented the suspend count. We defer to the next attempt, rather than
441*795d594fSAndroid Build Coastguard Worker         // waiting for it to suspend. Note that this may still unnecessarily trigger a signal
442*795d594fSAndroid Build Coastguard Worker         // handler, but it should be exceedingly rare.
443*795d594fSAndroid Build Coastguard Worker         thread->DecrementSuspendCount(self);
444*795d594fSAndroid Build Coastguard Worker         Thread::resume_cond_->Broadcast(self);
445*795d594fSAndroid Build Coastguard Worker         next_starting_thread = std::min(next_starting_thread, i);
446*795d594fSAndroid Build Coastguard Worker       }
447*795d594fSAndroid Build Coastguard Worker     }
448*795d594fSAndroid Build Coastguard Worker     starting_thread = next_starting_thread;
449*795d594fSAndroid Build Coastguard Worker   } while (starting_thread != nthreads);
450*795d594fSAndroid Build Coastguard Worker 
451*795d594fSAndroid Build Coastguard Worker   // Finally run the checkpoint on ourself. We will already have run the flip function, if we're
452*795d594fSAndroid Build Coastguard Worker   // runnable.
453*795d594fSAndroid Build Coastguard Worker   Locks::thread_list_lock_->Unlock(self);
454*795d594fSAndroid Build Coastguard Worker   Locks::thread_suspend_count_lock_->Unlock(self);
455*795d594fSAndroid Build Coastguard Worker   checkpoint_function->Run(self);
456*795d594fSAndroid Build Coastguard Worker 
457*795d594fSAndroid Build Coastguard Worker   if (acquire_mutator_lock) {
458*795d594fSAndroid Build Coastguard Worker     self->TransitionFromRunnableToSuspended(old_thread_state);
459*795d594fSAndroid Build Coastguard Worker   } else {
460*795d594fSAndroid Build Coastguard Worker     fake_mutator_unlock();
461*795d594fSAndroid Build Coastguard Worker   }
462*795d594fSAndroid Build Coastguard Worker 
463*795d594fSAndroid Build Coastguard Worker   DCHECK(std::all_of(remaining_threads.cbegin(), remaining_threads.cend(), [](Thread* thread) {
464*795d594fSAndroid Build Coastguard Worker     return thread == nullptr;
465*795d594fSAndroid Build Coastguard Worker   }));
466*795d594fSAndroid Build Coastguard Worker   Thread::DCheckUnregisteredEverywhere(&tefs[0], &tefs[nthreads - 1]);
467*795d594fSAndroid Build Coastguard Worker 
468*795d594fSAndroid Build Coastguard Worker   if (kIsDebugBuild && allow_lock_checking & !acquire_mutator_lock) {
469*795d594fSAndroid Build Coastguard Worker     self->AllowPreMonitorMutexes();
470*795d594fSAndroid Build Coastguard Worker   }
471*795d594fSAndroid Build Coastguard Worker   return count;
472*795d594fSAndroid Build Coastguard Worker }
473*795d594fSAndroid Build Coastguard Worker 
RunEmptyCheckpoint()474*795d594fSAndroid Build Coastguard Worker void ThreadList::RunEmptyCheckpoint() {
475*795d594fSAndroid Build Coastguard Worker   Thread* self = Thread::Current();
476*795d594fSAndroid Build Coastguard Worker   Locks::mutator_lock_->AssertNotExclusiveHeld(self);
477*795d594fSAndroid Build Coastguard Worker   Locks::thread_list_lock_->AssertNotHeld(self);
478*795d594fSAndroid Build Coastguard Worker   Locks::thread_suspend_count_lock_->AssertNotHeld(self);
479*795d594fSAndroid Build Coastguard Worker   std::vector<uint32_t> runnable_thread_ids;
480*795d594fSAndroid Build Coastguard Worker   size_t count = 0;
481*795d594fSAndroid Build Coastguard Worker   Barrier* barrier = empty_checkpoint_barrier_.get();
482*795d594fSAndroid Build Coastguard Worker   barrier->Init(self, 0);
483*795d594fSAndroid Build Coastguard Worker   {
484*795d594fSAndroid Build Coastguard Worker     MutexLock mu(self, *Locks::thread_list_lock_);
485*795d594fSAndroid Build Coastguard Worker     MutexLock mu2(self, *Locks::thread_suspend_count_lock_);
486*795d594fSAndroid Build Coastguard Worker     for (Thread* thread : list_) {
487*795d594fSAndroid Build Coastguard Worker       if (thread != self) {
488*795d594fSAndroid Build Coastguard Worker         while (true) {
489*795d594fSAndroid Build Coastguard Worker           if (thread->RequestEmptyCheckpoint()) {
490*795d594fSAndroid Build Coastguard Worker             // This thread will run an empty checkpoint (decrement the empty checkpoint barrier)
491*795d594fSAndroid Build Coastguard Worker             // some time in the near future.
492*795d594fSAndroid Build Coastguard Worker             ++count;
493*795d594fSAndroid Build Coastguard Worker             if (kIsDebugBuild) {
494*795d594fSAndroid Build Coastguard Worker               runnable_thread_ids.push_back(thread->GetThreadId());
495*795d594fSAndroid Build Coastguard Worker             }
496*795d594fSAndroid Build Coastguard Worker             break;
497*795d594fSAndroid Build Coastguard Worker           }
498*795d594fSAndroid Build Coastguard Worker           if (thread->GetState() != ThreadState::kRunnable) {
499*795d594fSAndroid Build Coastguard Worker             // It's seen suspended, we are done because it must not be in the middle of a mutator
500*795d594fSAndroid Build Coastguard Worker             // heap access.
501*795d594fSAndroid Build Coastguard Worker             break;
502*795d594fSAndroid Build Coastguard Worker           }
503*795d594fSAndroid Build Coastguard Worker         }
504*795d594fSAndroid Build Coastguard Worker       }
505*795d594fSAndroid Build Coastguard Worker     }
506*795d594fSAndroid Build Coastguard Worker   }
507*795d594fSAndroid Build Coastguard Worker 
508*795d594fSAndroid Build Coastguard Worker   // Wake up the threads blocking for weak ref access so that they will respond to the empty
509*795d594fSAndroid Build Coastguard Worker   // checkpoint request. Otherwise we will hang as they are blocking in the kRunnable state.
510*795d594fSAndroid Build Coastguard Worker   Runtime::Current()->GetHeap()->GetReferenceProcessor()->BroadcastForSlowPath(self);
511*795d594fSAndroid Build Coastguard Worker   Runtime::Current()->BroadcastForNewSystemWeaks(/*broadcast_for_checkpoint=*/true);
512*795d594fSAndroid Build Coastguard Worker   {
513*795d594fSAndroid Build Coastguard Worker     ScopedThreadStateChange tsc(self, ThreadState::kWaitingForCheckPointsToRun);
514*795d594fSAndroid Build Coastguard Worker     uint64_t total_wait_time = 0;
515*795d594fSAndroid Build Coastguard Worker     bool first_iter = true;
516*795d594fSAndroid Build Coastguard Worker     while (true) {
517*795d594fSAndroid Build Coastguard Worker       // Wake up the runnable threads blocked on the mutexes that another thread, which is blocked
518*795d594fSAndroid Build Coastguard Worker       // on a weak ref access, holds (indirectly blocking for weak ref access through another thread
519*795d594fSAndroid Build Coastguard Worker       // and a mutex.) This needs to be done periodically because the thread may be preempted
520*795d594fSAndroid Build Coastguard Worker       // between the CheckEmptyCheckpointFromMutex call and the subsequent futex wait in
521*795d594fSAndroid Build Coastguard Worker       // Mutex::ExclusiveLock, etc. when the wakeup via WakeupToRespondToEmptyCheckpoint
522*795d594fSAndroid Build Coastguard Worker       // arrives. This could cause a *very rare* deadlock, if not repeated. Most of the cases are
523*795d594fSAndroid Build Coastguard Worker       // handled in the first iteration.
524*795d594fSAndroid Build Coastguard Worker       for (BaseMutex* mutex : Locks::expected_mutexes_on_weak_ref_access_) {
525*795d594fSAndroid Build Coastguard Worker         mutex->WakeupToRespondToEmptyCheckpoint();
526*795d594fSAndroid Build Coastguard Worker       }
527*795d594fSAndroid Build Coastguard Worker       static constexpr uint64_t kEmptyCheckpointPeriodicTimeoutMs = 100;  // 100ms
528*795d594fSAndroid Build Coastguard Worker       static constexpr uint64_t kEmptyCheckpointTotalTimeoutMs = 600 * 1000;  // 10 minutes.
529*795d594fSAndroid Build Coastguard Worker       size_t barrier_count = first_iter ? count : 0;
530*795d594fSAndroid Build Coastguard Worker       first_iter = false;  // Don't add to the barrier count from the second iteration on.
531*795d594fSAndroid Build Coastguard Worker       bool timed_out = barrier->Increment(self, barrier_count, kEmptyCheckpointPeriodicTimeoutMs);
532*795d594fSAndroid Build Coastguard Worker       if (!timed_out) {
533*795d594fSAndroid Build Coastguard Worker         break;  // Success
534*795d594fSAndroid Build Coastguard Worker       }
535*795d594fSAndroid Build Coastguard Worker       // This is a very rare case.
536*795d594fSAndroid Build Coastguard Worker       total_wait_time += kEmptyCheckpointPeriodicTimeoutMs;
537*795d594fSAndroid Build Coastguard Worker       if (kIsDebugBuild && total_wait_time > kEmptyCheckpointTotalTimeoutMs) {
538*795d594fSAndroid Build Coastguard Worker         std::ostringstream ss;
539*795d594fSAndroid Build Coastguard Worker         ss << "Empty checkpoint timeout\n";
540*795d594fSAndroid Build Coastguard Worker         ss << "Barrier count " << barrier->GetCount(self) << "\n";
541*795d594fSAndroid Build Coastguard Worker         ss << "Runnable thread IDs";
542*795d594fSAndroid Build Coastguard Worker         for (uint32_t tid : runnable_thread_ids) {
543*795d594fSAndroid Build Coastguard Worker           ss << " " << tid;
544*795d594fSAndroid Build Coastguard Worker         }
545*795d594fSAndroid Build Coastguard Worker         ss << "\n";
546*795d594fSAndroid Build Coastguard Worker         Locks::mutator_lock_->Dump(ss);
547*795d594fSAndroid Build Coastguard Worker         ss << "\n";
548*795d594fSAndroid Build Coastguard Worker         LOG(FATAL_WITHOUT_ABORT) << ss.str();
549*795d594fSAndroid Build Coastguard Worker         // Some threads in 'runnable_thread_ids' are probably stuck. Try to dump their stacks.
550*795d594fSAndroid Build Coastguard Worker         // Avoid using ThreadList::Dump() initially because it is likely to get stuck as well.
551*795d594fSAndroid Build Coastguard Worker         {
552*795d594fSAndroid Build Coastguard Worker           ScopedObjectAccess soa(self);
553*795d594fSAndroid Build Coastguard Worker           MutexLock mu1(self, *Locks::thread_list_lock_);
554*795d594fSAndroid Build Coastguard Worker           for (Thread* thread : GetList()) {
555*795d594fSAndroid Build Coastguard Worker             uint32_t tid = thread->GetThreadId();
556*795d594fSAndroid Build Coastguard Worker             bool is_in_runnable_thread_ids =
557*795d594fSAndroid Build Coastguard Worker                 std::find(runnable_thread_ids.begin(), runnable_thread_ids.end(), tid) !=
558*795d594fSAndroid Build Coastguard Worker                 runnable_thread_ids.end();
559*795d594fSAndroid Build Coastguard Worker             if (is_in_runnable_thread_ids &&
560*795d594fSAndroid Build Coastguard Worker                 thread->ReadFlag(ThreadFlag::kEmptyCheckpointRequest)) {
561*795d594fSAndroid Build Coastguard Worker               // Found a runnable thread that hasn't responded to the empty checkpoint request.
562*795d594fSAndroid Build Coastguard Worker               // Assume it's stuck and safe to dump its stack.
563*795d594fSAndroid Build Coastguard Worker               thread->Dump(LOG_STREAM(FATAL_WITHOUT_ABORT),
564*795d594fSAndroid Build Coastguard Worker                            /*dump_native_stack=*/ true,
565*795d594fSAndroid Build Coastguard Worker                            /*force_dump_stack=*/ true);
566*795d594fSAndroid Build Coastguard Worker             }
567*795d594fSAndroid Build Coastguard Worker           }
568*795d594fSAndroid Build Coastguard Worker         }
569*795d594fSAndroid Build Coastguard Worker         LOG(FATAL_WITHOUT_ABORT)
570*795d594fSAndroid Build Coastguard Worker             << "Dumped runnable threads that haven't responded to empty checkpoint.";
571*795d594fSAndroid Build Coastguard Worker         // Now use ThreadList::Dump() to dump more threads, noting it may get stuck.
572*795d594fSAndroid Build Coastguard Worker         Dump(LOG_STREAM(FATAL_WITHOUT_ABORT));
573*795d594fSAndroid Build Coastguard Worker         LOG(FATAL) << "Dumped all threads.";
574*795d594fSAndroid Build Coastguard Worker       }
575*795d594fSAndroid Build Coastguard Worker     }
576*795d594fSAndroid Build Coastguard Worker   }
577*795d594fSAndroid Build Coastguard Worker }
578*795d594fSAndroid Build Coastguard Worker 
579*795d594fSAndroid Build Coastguard Worker // Separate function to disable just the right amount of thread-safety analysis.
AcquireMutatorLockSharedUncontended(Thread * self)580*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void AcquireMutatorLockSharedUncontended(Thread* self)
581*795d594fSAndroid Build Coastguard Worker     ACQUIRE_SHARED(*Locks::mutator_lock_) NO_THREAD_SAFETY_ANALYSIS {
582*795d594fSAndroid Build Coastguard Worker   bool success = Locks::mutator_lock_->SharedTryLock(self, /*check=*/false);
583*795d594fSAndroid Build Coastguard Worker   CHECK(success);
584*795d594fSAndroid Build Coastguard Worker }
585*795d594fSAndroid Build Coastguard Worker 
586*795d594fSAndroid Build Coastguard Worker // A checkpoint/suspend-all hybrid to switch thread roots from
587*795d594fSAndroid Build Coastguard Worker // from-space to to-space refs. Used to synchronize threads at a point
588*795d594fSAndroid Build Coastguard Worker // to mark the initiation of marking while maintaining the to-space
589*795d594fSAndroid Build Coastguard Worker // invariant.
FlipThreadRoots(Closure * thread_flip_visitor,Closure * flip_callback,gc::collector::GarbageCollector * collector,gc::GcPauseListener * pause_listener)590*795d594fSAndroid Build Coastguard Worker void ThreadList::FlipThreadRoots(Closure* thread_flip_visitor,
591*795d594fSAndroid Build Coastguard Worker                                  Closure* flip_callback,
592*795d594fSAndroid Build Coastguard Worker                                  gc::collector::GarbageCollector* collector,
593*795d594fSAndroid Build Coastguard Worker                                  gc::GcPauseListener* pause_listener) {
594*795d594fSAndroid Build Coastguard Worker   TimingLogger::ScopedTiming split("ThreadListFlip", collector->GetTimings());
595*795d594fSAndroid Build Coastguard Worker   Thread* self = Thread::Current();
596*795d594fSAndroid Build Coastguard Worker   Locks::mutator_lock_->AssertNotHeld(self);
597*795d594fSAndroid Build Coastguard Worker   Locks::thread_list_lock_->AssertNotHeld(self);
598*795d594fSAndroid Build Coastguard Worker   Locks::thread_suspend_count_lock_->AssertNotHeld(self);
599*795d594fSAndroid Build Coastguard Worker   CHECK_NE(self->GetState(), ThreadState::kRunnable);
600*795d594fSAndroid Build Coastguard Worker 
601*795d594fSAndroid Build Coastguard Worker   collector->GetHeap()->ThreadFlipBegin(self);  // Sync with JNI critical calls.
602*795d594fSAndroid Build Coastguard Worker 
603*795d594fSAndroid Build Coastguard Worker   // ThreadFlipBegin happens before we suspend all the threads, so it does not
604*795d594fSAndroid Build Coastguard Worker   // count towards the pause.
605*795d594fSAndroid Build Coastguard Worker   const uint64_t suspend_start_time = NanoTime();
606*795d594fSAndroid Build Coastguard Worker   VLOG(threads) << "Suspending all for thread flip";
607*795d594fSAndroid Build Coastguard Worker   {
608*795d594fSAndroid Build Coastguard Worker     ScopedTrace trace("ThreadFlipSuspendAll");
609*795d594fSAndroid Build Coastguard Worker     SuspendAllInternal(self);
610*795d594fSAndroid Build Coastguard Worker   }
611*795d594fSAndroid Build Coastguard Worker 
612*795d594fSAndroid Build Coastguard Worker   std::vector<Thread*> flipping_threads;  // All suspended threads. Includes us.
613*795d594fSAndroid Build Coastguard Worker   int thread_count;
614*795d594fSAndroid Build Coastguard Worker   // Flipping threads might exit between the time we resume them and try to run the flip function.
615*795d594fSAndroid Build Coastguard Worker   // Track that in a parallel vector.
616*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ThreadExitFlag[]> exit_flags;
617*795d594fSAndroid Build Coastguard Worker 
618*795d594fSAndroid Build Coastguard Worker   {
619*795d594fSAndroid Build Coastguard Worker     TimingLogger::ScopedTiming t("FlipThreadSuspension", collector->GetTimings());
620*795d594fSAndroid Build Coastguard Worker     if (pause_listener != nullptr) {
621*795d594fSAndroid Build Coastguard Worker       pause_listener->StartPause();
622*795d594fSAndroid Build Coastguard Worker     }
623*795d594fSAndroid Build Coastguard Worker 
624*795d594fSAndroid Build Coastguard Worker     // Run the flip callback for the collector.
625*795d594fSAndroid Build Coastguard Worker     Locks::mutator_lock_->ExclusiveLock(self);
626*795d594fSAndroid Build Coastguard Worker     suspend_all_histogram_.AdjustAndAddValue(NanoTime() - suspend_start_time);
627*795d594fSAndroid Build Coastguard Worker     flip_callback->Run(self);
628*795d594fSAndroid Build Coastguard Worker 
629*795d594fSAndroid Build Coastguard Worker     {
630*795d594fSAndroid Build Coastguard Worker       MutexLock mu(self, *Locks::thread_list_lock_);
631*795d594fSAndroid Build Coastguard Worker       MutexLock mu2(self, *Locks::thread_suspend_count_lock_);
632*795d594fSAndroid Build Coastguard Worker       thread_count = list_.size();
633*795d594fSAndroid Build Coastguard Worker       exit_flags.reset(new ThreadExitFlag[thread_count]);
634*795d594fSAndroid Build Coastguard Worker       flipping_threads.resize(thread_count, nullptr);
635*795d594fSAndroid Build Coastguard Worker       int i = 1;
636*795d594fSAndroid Build Coastguard Worker       for (Thread* thread : list_) {
637*795d594fSAndroid Build Coastguard Worker         // Set the flip function for all threads because once we start resuming any threads,
638*795d594fSAndroid Build Coastguard Worker         // they may need to run the flip function on behalf of other threads, even this one.
639*795d594fSAndroid Build Coastguard Worker         DCHECK(thread == self || thread->IsSuspended());
640*795d594fSAndroid Build Coastguard Worker         thread->SetFlipFunction(thread_flip_visitor);
641*795d594fSAndroid Build Coastguard Worker         // Put ourselves first, so other threads are more likely to have finished before we get
642*795d594fSAndroid Build Coastguard Worker         // there.
643*795d594fSAndroid Build Coastguard Worker         int thread_index = thread == self ? 0 : i++;
644*795d594fSAndroid Build Coastguard Worker         flipping_threads[thread_index] = thread;
645*795d594fSAndroid Build Coastguard Worker         thread->NotifyOnThreadExit(&exit_flags[thread_index]);
646*795d594fSAndroid Build Coastguard Worker       }
647*795d594fSAndroid Build Coastguard Worker       DCHECK(i == thread_count);
648*795d594fSAndroid Build Coastguard Worker     }
649*795d594fSAndroid Build Coastguard Worker 
650*795d594fSAndroid Build Coastguard Worker     if (pause_listener != nullptr) {
651*795d594fSAndroid Build Coastguard Worker       pause_listener->EndPause();
652*795d594fSAndroid Build Coastguard Worker     }
653*795d594fSAndroid Build Coastguard Worker   }
654*795d594fSAndroid Build Coastguard Worker   // Any new threads created after this will be created by threads that already ran their flip
655*795d594fSAndroid Build Coastguard Worker   // functions. In the normal GC use case in which the flip function converts all local references
656*795d594fSAndroid Build Coastguard Worker   // to to-space references, these newly created threads will also see only to-space references.
657*795d594fSAndroid Build Coastguard Worker 
658*795d594fSAndroid Build Coastguard Worker   // Resume threads, making sure that we do not release suspend_count_lock_ until we've reacquired
659*795d594fSAndroid Build Coastguard Worker   // the mutator_lock_ in shared mode, and decremented suspend_all_count_.  This avoids a
660*795d594fSAndroid Build Coastguard Worker   // concurrent SuspendAll, and ensures that newly started threads see a correct value of
661*795d594fSAndroid Build Coastguard Worker   // suspend_all_count.
662*795d594fSAndroid Build Coastguard Worker   {
663*795d594fSAndroid Build Coastguard Worker     MutexLock mu(self, *Locks::thread_list_lock_);
664*795d594fSAndroid Build Coastguard Worker     Locks::thread_suspend_count_lock_->Lock(self);
665*795d594fSAndroid Build Coastguard Worker     ResumeAllInternal(self);
666*795d594fSAndroid Build Coastguard Worker   }
667*795d594fSAndroid Build Coastguard Worker   collector->RegisterPause(NanoTime() - suspend_start_time);
668*795d594fSAndroid Build Coastguard Worker 
669*795d594fSAndroid Build Coastguard Worker   // Since all threads were suspended, they will attempt to run the flip function before
670*795d594fSAndroid Build Coastguard Worker   // reentering a runnable state. We will also attempt to run the flip functions ourselves.  Any
671*795d594fSAndroid Build Coastguard Worker   // intervening checkpoint request will do the same.  Exactly one of those flip function attempts
672*795d594fSAndroid Build Coastguard Worker   // will succeed, and the target thread will not be able to reenter a runnable state until one of
673*795d594fSAndroid Build Coastguard Worker   // them does.
674*795d594fSAndroid Build Coastguard Worker 
675*795d594fSAndroid Build Coastguard Worker   // Try to run the closure on the other threads.
676*795d594fSAndroid Build Coastguard Worker   TimingLogger::ScopedTiming split3("RunningThreadFlips", collector->GetTimings());
677*795d594fSAndroid Build Coastguard Worker   // Reacquire the mutator lock while holding suspend_count_lock. This cannot fail, since we
678*795d594fSAndroid Build Coastguard Worker   // do not acquire the mutator lock unless suspend_all_count was read as 0 while holding
679*795d594fSAndroid Build Coastguard Worker   // suspend_count_lock. We did not release suspend_count_lock since releasing the mutator
680*795d594fSAndroid Build Coastguard Worker   // lock.
681*795d594fSAndroid Build Coastguard Worker   AcquireMutatorLockSharedUncontended(self);
682*795d594fSAndroid Build Coastguard Worker 
683*795d594fSAndroid Build Coastguard Worker   Locks::thread_suspend_count_lock_->Unlock(self);
684*795d594fSAndroid Build Coastguard Worker   // Concurrent SuspendAll may now see zero suspend_all_count_, but block on mutator_lock_.
685*795d594fSAndroid Build Coastguard Worker 
686*795d594fSAndroid Build Coastguard Worker   collector->GetHeap()->ThreadFlipEnd(self);
687*795d594fSAndroid Build Coastguard Worker 
688*795d594fSAndroid Build Coastguard Worker   for (int i = 0; i < thread_count; ++i) {
689*795d594fSAndroid Build Coastguard Worker     bool finished;
690*795d594fSAndroid Build Coastguard Worker     Thread::EnsureFlipFunctionStarted(
691*795d594fSAndroid Build Coastguard Worker         self, flipping_threads[i], Thread::StateAndFlags(0), &exit_flags[i], &finished);
692*795d594fSAndroid Build Coastguard Worker     if (finished) {
693*795d594fSAndroid Build Coastguard Worker       MutexLock mu2(self, *Locks::thread_list_lock_);
694*795d594fSAndroid Build Coastguard Worker       flipping_threads[i]->UnregisterThreadExitFlag(&exit_flags[i]);
695*795d594fSAndroid Build Coastguard Worker       flipping_threads[i] = nullptr;
696*795d594fSAndroid Build Coastguard Worker     }
697*795d594fSAndroid Build Coastguard Worker   }
698*795d594fSAndroid Build Coastguard Worker   // Make sure all flips complete before we return.
699*795d594fSAndroid Build Coastguard Worker   for (int i = 0; i < thread_count; ++i) {
700*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(flipping_threads[i] != nullptr)) {
701*795d594fSAndroid Build Coastguard Worker       flipping_threads[i]->WaitForFlipFunctionTestingExited(self, &exit_flags[i]);
702*795d594fSAndroid Build Coastguard Worker       MutexLock mu2(self, *Locks::thread_list_lock_);
703*795d594fSAndroid Build Coastguard Worker       flipping_threads[i]->UnregisterThreadExitFlag(&exit_flags[i]);
704*795d594fSAndroid Build Coastguard Worker     }
705*795d594fSAndroid Build Coastguard Worker   }
706*795d594fSAndroid Build Coastguard Worker 
707*795d594fSAndroid Build Coastguard Worker   Thread::DCheckUnregisteredEverywhere(&exit_flags[0], &exit_flags[thread_count - 1]);
708*795d594fSAndroid Build Coastguard Worker 
709*795d594fSAndroid Build Coastguard Worker   Locks::mutator_lock_->SharedUnlock(self);
710*795d594fSAndroid Build Coastguard Worker }
711*795d594fSAndroid Build Coastguard Worker 
712*795d594fSAndroid Build Coastguard Worker // True only for debugging suspend timeout code. The resulting timeouts are short enough that
713*795d594fSAndroid Build Coastguard Worker // failures are expected.
714*795d594fSAndroid Build Coastguard Worker static constexpr bool kShortSuspendTimeouts = false;
715*795d594fSAndroid Build Coastguard Worker 
716*795d594fSAndroid Build Coastguard Worker static constexpr unsigned kSuspendBarrierIters = kShortSuspendTimeouts ? 5 : 20;
717*795d594fSAndroid Build Coastguard Worker 
718*795d594fSAndroid Build Coastguard Worker #if ART_USE_FUTEXES
719*795d594fSAndroid Build Coastguard Worker 
720*795d594fSAndroid Build Coastguard Worker // Returns true if it timed out.
WaitOnceForSuspendBarrier(AtomicInteger * barrier,int32_t cur_val,uint64_t timeout_ns)721*795d594fSAndroid Build Coastguard Worker static bool WaitOnceForSuspendBarrier(AtomicInteger* barrier,
722*795d594fSAndroid Build Coastguard Worker                                       int32_t cur_val,
723*795d594fSAndroid Build Coastguard Worker                                       uint64_t timeout_ns) {
724*795d594fSAndroid Build Coastguard Worker   timespec wait_timeout;
725*795d594fSAndroid Build Coastguard Worker   if (kShortSuspendTimeouts) {
726*795d594fSAndroid Build Coastguard Worker     timeout_ns = MsToNs(kSuspendBarrierIters);
727*795d594fSAndroid Build Coastguard Worker     CHECK_GE(NsToMs(timeout_ns / kSuspendBarrierIters), 1ul);
728*795d594fSAndroid Build Coastguard Worker   } else {
729*795d594fSAndroid Build Coastguard Worker     DCHECK_GE(NsToMs(timeout_ns / kSuspendBarrierIters), 10ul);
730*795d594fSAndroid Build Coastguard Worker   }
731*795d594fSAndroid Build Coastguard Worker   InitTimeSpec(false, CLOCK_MONOTONIC, NsToMs(timeout_ns / kSuspendBarrierIters), 0, &wait_timeout);
732*795d594fSAndroid Build Coastguard Worker   if (futex(barrier->Address(), FUTEX_WAIT_PRIVATE, cur_val, &wait_timeout, nullptr, 0) != 0) {
733*795d594fSAndroid Build Coastguard Worker     if (errno == ETIMEDOUT) {
734*795d594fSAndroid Build Coastguard Worker       return true;
735*795d594fSAndroid Build Coastguard Worker     } else if (errno != EAGAIN && errno != EINTR) {
736*795d594fSAndroid Build Coastguard Worker       PLOG(FATAL) << "futex wait for suspend barrier failed";
737*795d594fSAndroid Build Coastguard Worker     }
738*795d594fSAndroid Build Coastguard Worker   }
739*795d594fSAndroid Build Coastguard Worker   return false;
740*795d594fSAndroid Build Coastguard Worker }
741*795d594fSAndroid Build Coastguard Worker 
742*795d594fSAndroid Build Coastguard Worker #else
743*795d594fSAndroid Build Coastguard Worker 
WaitOnceForSuspendBarrier(AtomicInteger * barrier,int32_t cur_val,uint64_t timeout_ns)744*795d594fSAndroid Build Coastguard Worker static bool WaitOnceForSuspendBarrier(AtomicInteger* barrier,
745*795d594fSAndroid Build Coastguard Worker                                       int32_t cur_val,
746*795d594fSAndroid Build Coastguard Worker                                       uint64_t timeout_ns) {
747*795d594fSAndroid Build Coastguard Worker   // In the normal case, aim for a couple of hundred milliseconds.
748*795d594fSAndroid Build Coastguard Worker   static constexpr unsigned kInnerIters =
749*795d594fSAndroid Build Coastguard Worker       kShortSuspendTimeouts ? 1'000 : (timeout_ns / 1000) / kSuspendBarrierIters;
750*795d594fSAndroid Build Coastguard Worker   DCHECK_GE(kInnerIters, 1'000u);
751*795d594fSAndroid Build Coastguard Worker   for (int i = 0; i < kInnerIters; ++i) {
752*795d594fSAndroid Build Coastguard Worker     sched_yield();
753*795d594fSAndroid Build Coastguard Worker     if (barrier->load(std::memory_order_acquire) == 0) {
754*795d594fSAndroid Build Coastguard Worker       return false;
755*795d594fSAndroid Build Coastguard Worker     }
756*795d594fSAndroid Build Coastguard Worker   }
757*795d594fSAndroid Build Coastguard Worker   return true;
758*795d594fSAndroid Build Coastguard Worker }
759*795d594fSAndroid Build Coastguard Worker 
760*795d594fSAndroid Build Coastguard Worker #endif  // ART_USE_FUTEXES
761*795d594fSAndroid Build Coastguard Worker 
WaitForSuspendBarrier(AtomicInteger * barrier,pid_t t,int attempt_of_4)762*795d594fSAndroid Build Coastguard Worker std::optional<std::string> ThreadList::WaitForSuspendBarrier(AtomicInteger* barrier,
763*795d594fSAndroid Build Coastguard Worker                                                              pid_t t,
764*795d594fSAndroid Build Coastguard Worker                                                              int attempt_of_4) {
765*795d594fSAndroid Build Coastguard Worker   // Only fail after kIter timeouts, to make us robust against app freezing.
766*795d594fSAndroid Build Coastguard Worker #if ART_USE_FUTEXES
767*795d594fSAndroid Build Coastguard Worker   const uint64_t start_time = NanoTime();
768*795d594fSAndroid Build Coastguard Worker #endif
769*795d594fSAndroid Build Coastguard Worker   uint64_t timeout_ns =
770*795d594fSAndroid Build Coastguard Worker       attempt_of_4 == 0 ? thread_suspend_timeout_ns_ : thread_suspend_timeout_ns_ / 4;
771*795d594fSAndroid Build Coastguard Worker 
772*795d594fSAndroid Build Coastguard Worker   uint64_t avg_wait_multiplier = 1;
773*795d594fSAndroid Build Coastguard Worker   uint64_t wait_multiplier = 1;
774*795d594fSAndroid Build Coastguard Worker   if (attempt_of_4 != 1) {
775*795d594fSAndroid Build Coastguard Worker     // TODO: RequestSynchronousCheckpoint routinely passes attempt_of_4 = 0. Can
776*795d594fSAndroid Build Coastguard Worker     // we avoid the getpriority() call?
777*795d594fSAndroid Build Coastguard Worker     if (getpriority(PRIO_PROCESS, 0 /* this thread */) > 0) {
778*795d594fSAndroid Build Coastguard Worker       // We're a low priority thread, and thus have a longer ANR timeout. Increase the suspend
779*795d594fSAndroid Build Coastguard Worker       // timeout.
780*795d594fSAndroid Build Coastguard Worker       avg_wait_multiplier = 3;
781*795d594fSAndroid Build Coastguard Worker     }
782*795d594fSAndroid Build Coastguard Worker     // To avoid the system calls in the common case, we fail to increase the first of 4 waits, but
783*795d594fSAndroid Build Coastguard Worker     // then compensate during the last one. This also allows somewhat longer thread monitoring
784*795d594fSAndroid Build Coastguard Worker     // before we time out.
785*795d594fSAndroid Build Coastguard Worker     wait_multiplier = attempt_of_4 == 4 ? 2 * avg_wait_multiplier - 1 : avg_wait_multiplier;
786*795d594fSAndroid Build Coastguard Worker     timeout_ns *= wait_multiplier;
787*795d594fSAndroid Build Coastguard Worker   }
788*795d594fSAndroid Build Coastguard Worker   bool collect_state = (t != 0 && (attempt_of_4 == 0 || attempt_of_4 == 4));
789*795d594fSAndroid Build Coastguard Worker   int32_t cur_val = barrier->load(std::memory_order_acquire);
790*795d594fSAndroid Build Coastguard Worker   if (cur_val <= 0) {
791*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(cur_val, 0);
792*795d594fSAndroid Build Coastguard Worker     return std::nullopt;
793*795d594fSAndroid Build Coastguard Worker   }
794*795d594fSAndroid Build Coastguard Worker   unsigned i = 0;
795*795d594fSAndroid Build Coastguard Worker   if (WaitOnceForSuspendBarrier(barrier, cur_val, timeout_ns)) {
796*795d594fSAndroid Build Coastguard Worker     i = 1;
797*795d594fSAndroid Build Coastguard Worker   }
798*795d594fSAndroid Build Coastguard Worker   cur_val = barrier->load(std::memory_order_acquire);
799*795d594fSAndroid Build Coastguard Worker   if (cur_val <= 0) {
800*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(cur_val, 0);
801*795d594fSAndroid Build Coastguard Worker     return std::nullopt;
802*795d594fSAndroid Build Coastguard Worker   }
803*795d594fSAndroid Build Coastguard Worker 
804*795d594fSAndroid Build Coastguard Worker   // Long wait; gather information in case of timeout.
805*795d594fSAndroid Build Coastguard Worker   std::string sampled_state = collect_state ? GetOsThreadStatQuick(t) : "";
806*795d594fSAndroid Build Coastguard Worker   while (i < kSuspendBarrierIters) {
807*795d594fSAndroid Build Coastguard Worker     if (WaitOnceForSuspendBarrier(barrier, cur_val, timeout_ns)) {
808*795d594fSAndroid Build Coastguard Worker       ++i;
809*795d594fSAndroid Build Coastguard Worker #if ART_USE_FUTEXES
810*795d594fSAndroid Build Coastguard Worker       if (!kShortSuspendTimeouts) {
811*795d594fSAndroid Build Coastguard Worker         CHECK_GE(NanoTime() - start_time, i * timeout_ns / kSuspendBarrierIters - 1'000'000);
812*795d594fSAndroid Build Coastguard Worker       }
813*795d594fSAndroid Build Coastguard Worker #endif
814*795d594fSAndroid Build Coastguard Worker     }
815*795d594fSAndroid Build Coastguard Worker     cur_val = barrier->load(std::memory_order_acquire);
816*795d594fSAndroid Build Coastguard Worker     if (cur_val <= 0) {
817*795d594fSAndroid Build Coastguard Worker       DCHECK_EQ(cur_val, 0);
818*795d594fSAndroid Build Coastguard Worker       return std::nullopt;
819*795d594fSAndroid Build Coastguard Worker     }
820*795d594fSAndroid Build Coastguard Worker   }
821*795d594fSAndroid Build Coastguard Worker   uint64_t final_wait_time = NanoTime() - start_time;
822*795d594fSAndroid Build Coastguard Worker   uint64_t total_wait_time = attempt_of_4 == 0 ?
823*795d594fSAndroid Build Coastguard Worker                                  final_wait_time :
824*795d594fSAndroid Build Coastguard Worker                                  4 * final_wait_time * avg_wait_multiplier / wait_multiplier;
825*795d594fSAndroid Build Coastguard Worker   return collect_state ? "Target states: [" + sampled_state + ", " + GetOsThreadStatQuick(t) + "]" +
826*795d594fSAndroid Build Coastguard Worker                              (cur_val == 0 ? "(barrier now passed)" : "") +
827*795d594fSAndroid Build Coastguard Worker                              " Final wait time: " + PrettyDuration(final_wait_time) +
828*795d594fSAndroid Build Coastguard Worker                              "; appr. total wait time: " + PrettyDuration(total_wait_time) :
829*795d594fSAndroid Build Coastguard Worker                          "";
830*795d594fSAndroid Build Coastguard Worker }
831*795d594fSAndroid Build Coastguard Worker 
SuspendAll(const char * cause,bool long_suspend)832*795d594fSAndroid Build Coastguard Worker void ThreadList::SuspendAll(const char* cause, bool long_suspend) {
833*795d594fSAndroid Build Coastguard Worker   Thread* self = Thread::Current();
834*795d594fSAndroid Build Coastguard Worker 
835*795d594fSAndroid Build Coastguard Worker   if (self != nullptr) {
836*795d594fSAndroid Build Coastguard Worker     VLOG(threads) << *self << " SuspendAll for " << cause << " starting...";
837*795d594fSAndroid Build Coastguard Worker   } else {
838*795d594fSAndroid Build Coastguard Worker     VLOG(threads) << "Thread[null] SuspendAll for " << cause << " starting...";
839*795d594fSAndroid Build Coastguard Worker   }
840*795d594fSAndroid Build Coastguard Worker   {
841*795d594fSAndroid Build Coastguard Worker     ScopedTrace trace("Suspending mutator threads");
842*795d594fSAndroid Build Coastguard Worker     const uint64_t start_time = NanoTime();
843*795d594fSAndroid Build Coastguard Worker 
844*795d594fSAndroid Build Coastguard Worker     SuspendAllInternal(self);
845*795d594fSAndroid Build Coastguard Worker     // All threads are known to have suspended (but a thread may still own the mutator lock)
846*795d594fSAndroid Build Coastguard Worker     // Make sure this thread grabs exclusive access to the mutator lock and its protected data.
847*795d594fSAndroid Build Coastguard Worker #if HAVE_TIMED_RWLOCK
848*795d594fSAndroid Build Coastguard Worker     while (true) {
849*795d594fSAndroid Build Coastguard Worker       if (Locks::mutator_lock_->ExclusiveLockWithTimeout(self,
850*795d594fSAndroid Build Coastguard Worker                                                          NsToMs(thread_suspend_timeout_ns_),
851*795d594fSAndroid Build Coastguard Worker                                                          0)) {
852*795d594fSAndroid Build Coastguard Worker         break;
853*795d594fSAndroid Build Coastguard Worker       } else if (!long_suspend_) {
854*795d594fSAndroid Build Coastguard Worker         // Reading long_suspend without the mutator lock is slightly racy, in some rare cases, this
855*795d594fSAndroid Build Coastguard Worker         // could result in a thread suspend timeout.
856*795d594fSAndroid Build Coastguard Worker         // Timeout if we wait more than thread_suspend_timeout_ns_ nanoseconds.
857*795d594fSAndroid Build Coastguard Worker         UnsafeLogFatalForThreadSuspendAllTimeout();
858*795d594fSAndroid Build Coastguard Worker       }
859*795d594fSAndroid Build Coastguard Worker     }
860*795d594fSAndroid Build Coastguard Worker #else
861*795d594fSAndroid Build Coastguard Worker     Locks::mutator_lock_->ExclusiveLock(self);
862*795d594fSAndroid Build Coastguard Worker #endif
863*795d594fSAndroid Build Coastguard Worker 
864*795d594fSAndroid Build Coastguard Worker     long_suspend_ = long_suspend;
865*795d594fSAndroid Build Coastguard Worker 
866*795d594fSAndroid Build Coastguard Worker     const uint64_t end_time = NanoTime();
867*795d594fSAndroid Build Coastguard Worker     const uint64_t suspend_time = end_time - start_time;
868*795d594fSAndroid Build Coastguard Worker     suspend_all_histogram_.AdjustAndAddValue(suspend_time);
869*795d594fSAndroid Build Coastguard Worker     if (suspend_time > kLongThreadSuspendThreshold) {
870*795d594fSAndroid Build Coastguard Worker       LOG(WARNING) << "Suspending all threads took: " << PrettyDuration(suspend_time);
871*795d594fSAndroid Build Coastguard Worker     }
872*795d594fSAndroid Build Coastguard Worker 
873*795d594fSAndroid Build Coastguard Worker     if (kDebugLocking) {
874*795d594fSAndroid Build Coastguard Worker       // Debug check that all threads are suspended.
875*795d594fSAndroid Build Coastguard Worker       AssertOtherThreadsAreSuspended(self);
876*795d594fSAndroid Build Coastguard Worker     }
877*795d594fSAndroid Build Coastguard Worker   }
878*795d594fSAndroid Build Coastguard Worker 
879*795d594fSAndroid Build Coastguard Worker   // SuspendAllInternal blocks if we are in the middle of a flip.
880*795d594fSAndroid Build Coastguard Worker   DCHECK(!self->ReadFlag(ThreadFlag::kPendingFlipFunction));
881*795d594fSAndroid Build Coastguard Worker   DCHECK(!self->ReadFlag(ThreadFlag::kRunningFlipFunction));
882*795d594fSAndroid Build Coastguard Worker 
883*795d594fSAndroid Build Coastguard Worker   ATraceBegin((std::string("Mutator threads suspended for ") + cause).c_str());
884*795d594fSAndroid Build Coastguard Worker 
885*795d594fSAndroid Build Coastguard Worker   if (self != nullptr) {
886*795d594fSAndroid Build Coastguard Worker     VLOG(threads) << *self << " SuspendAll complete";
887*795d594fSAndroid Build Coastguard Worker   } else {
888*795d594fSAndroid Build Coastguard Worker     VLOG(threads) << "Thread[null] SuspendAll complete";
889*795d594fSAndroid Build Coastguard Worker   }
890*795d594fSAndroid Build Coastguard Worker }
891*795d594fSAndroid Build Coastguard Worker 
892*795d594fSAndroid Build Coastguard Worker // Ensures all threads running Java suspend and that those not running Java don't start.
SuspendAllInternal(Thread * self,SuspendReason reason)893*795d594fSAndroid Build Coastguard Worker void ThreadList::SuspendAllInternal(Thread* self, SuspendReason reason) {
894*795d594fSAndroid Build Coastguard Worker   // self can be nullptr if this is an unregistered thread.
895*795d594fSAndroid Build Coastguard Worker   Locks::mutator_lock_->AssertNotExclusiveHeld(self);
896*795d594fSAndroid Build Coastguard Worker   Locks::thread_list_lock_->AssertNotHeld(self);
897*795d594fSAndroid Build Coastguard Worker   Locks::thread_suspend_count_lock_->AssertNotHeld(self);
898*795d594fSAndroid Build Coastguard Worker   if (kDebugLocking && self != nullptr) {
899*795d594fSAndroid Build Coastguard Worker     CHECK_NE(self->GetState(), ThreadState::kRunnable);
900*795d594fSAndroid Build Coastguard Worker   }
901*795d594fSAndroid Build Coastguard Worker 
902*795d594fSAndroid Build Coastguard Worker   // First request that all threads suspend, then wait for them to suspend before
903*795d594fSAndroid Build Coastguard Worker   // returning. This suspension scheme also relies on other behaviour:
904*795d594fSAndroid Build Coastguard Worker   // 1. Threads cannot be deleted while they are suspended or have a suspend-
905*795d594fSAndroid Build Coastguard Worker   //    request flag set - (see Unregister() below).
906*795d594fSAndroid Build Coastguard Worker   // 2. When threads are created, they are created in a suspended state (actually
907*795d594fSAndroid Build Coastguard Worker   //    kNative) and will never begin executing Java code without first checking
908*795d594fSAndroid Build Coastguard Worker   //    the suspend-request flag.
909*795d594fSAndroid Build Coastguard Worker 
910*795d594fSAndroid Build Coastguard Worker   // The atomic counter for number of threads that need to pass the barrier.
911*795d594fSAndroid Build Coastguard Worker   AtomicInteger pending_threads;
912*795d594fSAndroid Build Coastguard Worker 
913*795d594fSAndroid Build Coastguard Worker   for (int iter_count = 1;; ++iter_count) {
914*795d594fSAndroid Build Coastguard Worker     {
915*795d594fSAndroid Build Coastguard Worker       MutexLock mu(self, *Locks::thread_list_lock_);
916*795d594fSAndroid Build Coastguard Worker       MutexLock mu2(self, *Locks::thread_suspend_count_lock_);
917*795d594fSAndroid Build Coastguard Worker       if (suspend_all_count_ == 0) {
918*795d594fSAndroid Build Coastguard Worker         // Never run multiple SuspendAlls concurrently.
919*795d594fSAndroid Build Coastguard Worker         // If we are asked to suspend ourselves, we proceed anyway, but must ignore suspend
920*795d594fSAndroid Build Coastguard Worker         // request from other threads until we resume them.
921*795d594fSAndroid Build Coastguard Worker         bool found_myself = false;
922*795d594fSAndroid Build Coastguard Worker         // Update global suspend all state for attaching threads.
923*795d594fSAndroid Build Coastguard Worker         ++suspend_all_count_;
924*795d594fSAndroid Build Coastguard Worker         pending_threads.store(list_.size() - (self == nullptr ? 0 : 1), std::memory_order_relaxed);
925*795d594fSAndroid Build Coastguard Worker         // Increment everybody else's suspend count.
926*795d594fSAndroid Build Coastguard Worker         for (const auto& thread : list_) {
927*795d594fSAndroid Build Coastguard Worker           if (thread == self) {
928*795d594fSAndroid Build Coastguard Worker             found_myself = true;
929*795d594fSAndroid Build Coastguard Worker           } else {
930*795d594fSAndroid Build Coastguard Worker             VLOG(threads) << "requesting thread suspend: " << *thread;
931*795d594fSAndroid Build Coastguard Worker             DCHECK_EQ(suspend_all_count_, 1);
932*795d594fSAndroid Build Coastguard Worker             thread->IncrementSuspendCount(self, &pending_threads, nullptr, reason);
933*795d594fSAndroid Build Coastguard Worker             if (thread->IsSuspended()) {
934*795d594fSAndroid Build Coastguard Worker               // Effectively pass the barrier on behalf of the already suspended thread.
935*795d594fSAndroid Build Coastguard Worker               // The thread itself cannot yet have acted on our request since we still hold the
936*795d594fSAndroid Build Coastguard Worker               // suspend_count_lock_, and it will notice that kActiveSuspendBarrier has already
937*795d594fSAndroid Build Coastguard Worker               // been cleared if and when it acquires the lock in PassActiveSuspendBarriers().
938*795d594fSAndroid Build Coastguard Worker               DCHECK_EQ(thread->tlsPtr_.active_suspendall_barrier, &pending_threads);
939*795d594fSAndroid Build Coastguard Worker               pending_threads.fetch_sub(1, std::memory_order_seq_cst);
940*795d594fSAndroid Build Coastguard Worker               thread->tlsPtr_.active_suspendall_barrier = nullptr;
941*795d594fSAndroid Build Coastguard Worker               if (!thread->HasActiveSuspendBarrier()) {
942*795d594fSAndroid Build Coastguard Worker                 thread->AtomicClearFlag(ThreadFlag::kActiveSuspendBarrier);
943*795d594fSAndroid Build Coastguard Worker               }
944*795d594fSAndroid Build Coastguard Worker             }
945*795d594fSAndroid Build Coastguard Worker             // else:
946*795d594fSAndroid Build Coastguard Worker             // The target thread was not yet suspended, and hence will be forced to execute
947*795d594fSAndroid Build Coastguard Worker             // TransitionFromRunnableToSuspended shortly. Since we set the kSuspendRequest flag
948*795d594fSAndroid Build Coastguard Worker             // before checking, and it checks kActiveSuspendBarrier after noticing kSuspendRequest,
949*795d594fSAndroid Build Coastguard Worker             // it must notice kActiveSuspendBarrier when it does. Thus it is guaranteed to
950*795d594fSAndroid Build Coastguard Worker             // decrement the suspend barrier. We're relying on store; load ordering here, but
951*795d594fSAndroid Build Coastguard Worker             // that's not a problem, since state and flags all reside in the same atomic, and
952*795d594fSAndroid Build Coastguard Worker             // are thus properly ordered, even for relaxed accesses.
953*795d594fSAndroid Build Coastguard Worker           }
954*795d594fSAndroid Build Coastguard Worker         }
955*795d594fSAndroid Build Coastguard Worker         self->AtomicSetFlag(ThreadFlag::kSuspensionImmune, std::memory_order_relaxed);
956*795d594fSAndroid Build Coastguard Worker         DCHECK(self == nullptr || found_myself);
957*795d594fSAndroid Build Coastguard Worker         break;
958*795d594fSAndroid Build Coastguard Worker       }
959*795d594fSAndroid Build Coastguard Worker     }
960*795d594fSAndroid Build Coastguard Worker     if (iter_count >= kMaxSuspendRetries) {
961*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "Too many SuspendAll retries: " << iter_count;
962*795d594fSAndroid Build Coastguard Worker     } else {
963*795d594fSAndroid Build Coastguard Worker       MutexLock mu2(self, *Locks::thread_suspend_count_lock_);
964*795d594fSAndroid Build Coastguard Worker       DCHECK_LE(suspend_all_count_, 1);
965*795d594fSAndroid Build Coastguard Worker       if (suspend_all_count_ != 0) {
966*795d594fSAndroid Build Coastguard Worker         // This may take a while, and we're not runnable, and thus would otherwise not block.
967*795d594fSAndroid Build Coastguard Worker         Thread::resume_cond_->WaitHoldingLocks(self);
968*795d594fSAndroid Build Coastguard Worker         continue;
969*795d594fSAndroid Build Coastguard Worker       }
970*795d594fSAndroid Build Coastguard Worker     }
971*795d594fSAndroid Build Coastguard Worker     // We're already not runnable, so an attempt to suspend us should succeed.
972*795d594fSAndroid Build Coastguard Worker   }
973*795d594fSAndroid Build Coastguard Worker 
974*795d594fSAndroid Build Coastguard Worker   Thread* culprit = nullptr;
975*795d594fSAndroid Build Coastguard Worker   pid_t tid = 0;
976*795d594fSAndroid Build Coastguard Worker   std::ostringstream oss;
977*795d594fSAndroid Build Coastguard Worker   for (int attempt_of_4 = 1; attempt_of_4 <= 4; ++attempt_of_4) {
978*795d594fSAndroid Build Coastguard Worker     auto result = WaitForSuspendBarrier(&pending_threads, tid, attempt_of_4);
979*795d594fSAndroid Build Coastguard Worker     if (!result.has_value()) {
980*795d594fSAndroid Build Coastguard Worker       // Wait succeeded.
981*795d594fSAndroid Build Coastguard Worker       break;
982*795d594fSAndroid Build Coastguard Worker     }
983*795d594fSAndroid Build Coastguard Worker     if (attempt_of_4 == 3) {
984*795d594fSAndroid Build Coastguard Worker       // Second to the last attempt; Try to gather more information in case we time out.
985*795d594fSAndroid Build Coastguard Worker       MutexLock mu(self, *Locks::thread_list_lock_);
986*795d594fSAndroid Build Coastguard Worker       MutexLock mu2(self, *Locks::thread_suspend_count_lock_);
987*795d594fSAndroid Build Coastguard Worker       oss << "remaining threads: ";
988*795d594fSAndroid Build Coastguard Worker       for (const auto& thread : list_) {
989*795d594fSAndroid Build Coastguard Worker         if (thread != self && !thread->IsSuspended()) {
990*795d594fSAndroid Build Coastguard Worker           culprit = thread;
991*795d594fSAndroid Build Coastguard Worker           oss << *thread << ", ";
992*795d594fSAndroid Build Coastguard Worker         }
993*795d594fSAndroid Build Coastguard Worker       }
994*795d594fSAndroid Build Coastguard Worker       if (culprit != nullptr) {
995*795d594fSAndroid Build Coastguard Worker         tid = culprit->GetTid();
996*795d594fSAndroid Build Coastguard Worker       }
997*795d594fSAndroid Build Coastguard Worker     } else if (attempt_of_4 == 4) {
998*795d594fSAndroid Build Coastguard Worker       // Final attempt still timed out.
999*795d594fSAndroid Build Coastguard Worker       if (culprit == nullptr) {
1000*795d594fSAndroid Build Coastguard Worker         LOG(FATAL) << "SuspendAll timeout. Couldn't find holdouts.";
1001*795d594fSAndroid Build Coastguard Worker       } else {
1002*795d594fSAndroid Build Coastguard Worker         std::string name;
1003*795d594fSAndroid Build Coastguard Worker         culprit->GetThreadName(name);
1004*795d594fSAndroid Build Coastguard Worker         oss << "Info for " << name << ": ";
1005*795d594fSAndroid Build Coastguard Worker         std::string thr_descr =
1006*795d594fSAndroid Build Coastguard Worker             StringPrintf("state&flags: 0x%x, Java/native priority: %d/%d, barrier value: %d, ",
1007*795d594fSAndroid Build Coastguard Worker                          culprit->GetStateAndFlags(std::memory_order_relaxed).GetValue(),
1008*795d594fSAndroid Build Coastguard Worker                          culprit->GetNativePriority(),
1009*795d594fSAndroid Build Coastguard Worker                          getpriority(PRIO_PROCESS /* really thread */, culprit->GetTid()),
1010*795d594fSAndroid Build Coastguard Worker                          pending_threads.load());
1011*795d594fSAndroid Build Coastguard Worker         oss << thr_descr << result.value();
1012*795d594fSAndroid Build Coastguard Worker         culprit->AbortInThis("SuspendAll timeout; " + oss.str());
1013*795d594fSAndroid Build Coastguard Worker       }
1014*795d594fSAndroid Build Coastguard Worker     }
1015*795d594fSAndroid Build Coastguard Worker   }
1016*795d594fSAndroid Build Coastguard Worker }
1017*795d594fSAndroid Build Coastguard Worker 
ResumeAll()1018*795d594fSAndroid Build Coastguard Worker void ThreadList::ResumeAll() {
1019*795d594fSAndroid Build Coastguard Worker   Thread* self = Thread::Current();
1020*795d594fSAndroid Build Coastguard Worker   if (kDebugLocking) {
1021*795d594fSAndroid Build Coastguard Worker     // Debug check that all threads are suspended.
1022*795d594fSAndroid Build Coastguard Worker     AssertOtherThreadsAreSuspended(self);
1023*795d594fSAndroid Build Coastguard Worker   }
1024*795d594fSAndroid Build Coastguard Worker   MutexLock mu(self, *Locks::thread_list_lock_);
1025*795d594fSAndroid Build Coastguard Worker   MutexLock mu2(self, *Locks::thread_suspend_count_lock_);
1026*795d594fSAndroid Build Coastguard Worker   ATraceEnd();  // Matching "Mutator threads suspended ..." in SuspendAll.
1027*795d594fSAndroid Build Coastguard Worker   ResumeAllInternal(self);
1028*795d594fSAndroid Build Coastguard Worker }
1029*795d594fSAndroid Build Coastguard Worker 
1030*795d594fSAndroid Build Coastguard Worker // Holds thread_list_lock_ and suspend_count_lock_
ResumeAllInternal(Thread * self)1031*795d594fSAndroid Build Coastguard Worker void ThreadList::ResumeAllInternal(Thread* self) {
1032*795d594fSAndroid Build Coastguard Worker   DCHECK_NE(self->GetState(), ThreadState::kRunnable);
1033*795d594fSAndroid Build Coastguard Worker   if (self != nullptr) {
1034*795d594fSAndroid Build Coastguard Worker     VLOG(threads) << *self << " ResumeAll starting";
1035*795d594fSAndroid Build Coastguard Worker   } else {
1036*795d594fSAndroid Build Coastguard Worker     VLOG(threads) << "Thread[null] ResumeAll starting";
1037*795d594fSAndroid Build Coastguard Worker   }
1038*795d594fSAndroid Build Coastguard Worker 
1039*795d594fSAndroid Build Coastguard Worker   ScopedTrace trace("Resuming mutator threads");
1040*795d594fSAndroid Build Coastguard Worker 
1041*795d594fSAndroid Build Coastguard Worker   long_suspend_ = false;
1042*795d594fSAndroid Build Coastguard Worker 
1043*795d594fSAndroid Build Coastguard Worker   Locks::mutator_lock_->ExclusiveUnlock(self);
1044*795d594fSAndroid Build Coastguard Worker 
1045*795d594fSAndroid Build Coastguard Worker   // Decrement the suspend counts for all threads.
1046*795d594fSAndroid Build Coastguard Worker   for (const auto& thread : list_) {
1047*795d594fSAndroid Build Coastguard Worker     if (thread != self) {
1048*795d594fSAndroid Build Coastguard Worker       thread->DecrementSuspendCount(self);
1049*795d594fSAndroid Build Coastguard Worker     }
1050*795d594fSAndroid Build Coastguard Worker   }
1051*795d594fSAndroid Build Coastguard Worker 
1052*795d594fSAndroid Build Coastguard Worker   // Update global suspend all state for attaching threads. Unblocks other SuspendAlls once
1053*795d594fSAndroid Build Coastguard Worker   // suspend_count_lock_ is released.
1054*795d594fSAndroid Build Coastguard Worker   --suspend_all_count_;
1055*795d594fSAndroid Build Coastguard Worker   self->AtomicClearFlag(ThreadFlag::kSuspensionImmune, std::memory_order_relaxed);
1056*795d594fSAndroid Build Coastguard Worker   // Pending suspend requests for us will be handled when we become Runnable again.
1057*795d594fSAndroid Build Coastguard Worker 
1058*795d594fSAndroid Build Coastguard Worker   // Broadcast a notification to all suspended threads, some or all of
1059*795d594fSAndroid Build Coastguard Worker   // which may choose to wake up.  No need to wait for them.
1060*795d594fSAndroid Build Coastguard Worker   if (self != nullptr) {
1061*795d594fSAndroid Build Coastguard Worker     VLOG(threads) << *self << " ResumeAll waking others";
1062*795d594fSAndroid Build Coastguard Worker   } else {
1063*795d594fSAndroid Build Coastguard Worker     VLOG(threads) << "Thread[null] ResumeAll waking others";
1064*795d594fSAndroid Build Coastguard Worker   }
1065*795d594fSAndroid Build Coastguard Worker   Thread::resume_cond_->Broadcast(self);
1066*795d594fSAndroid Build Coastguard Worker 
1067*795d594fSAndroid Build Coastguard Worker   if (self != nullptr) {
1068*795d594fSAndroid Build Coastguard Worker     VLOG(threads) << *self << " ResumeAll complete";
1069*795d594fSAndroid Build Coastguard Worker   } else {
1070*795d594fSAndroid Build Coastguard Worker     VLOG(threads) << "Thread[null] ResumeAll complete";
1071*795d594fSAndroid Build Coastguard Worker   }
1072*795d594fSAndroid Build Coastguard Worker }
1073*795d594fSAndroid Build Coastguard Worker 
Resume(Thread * thread,SuspendReason reason)1074*795d594fSAndroid Build Coastguard Worker bool ThreadList::Resume(Thread* thread, SuspendReason reason) {
1075*795d594fSAndroid Build Coastguard Worker   // This assumes there was an ATraceBegin when we suspended the thread.
1076*795d594fSAndroid Build Coastguard Worker   ATraceEnd();
1077*795d594fSAndroid Build Coastguard Worker 
1078*795d594fSAndroid Build Coastguard Worker   Thread* self = Thread::Current();
1079*795d594fSAndroid Build Coastguard Worker   DCHECK_NE(thread, self);
1080*795d594fSAndroid Build Coastguard Worker   VLOG(threads) << "Resume(" << reinterpret_cast<void*>(thread) << ") starting..." << reason;
1081*795d594fSAndroid Build Coastguard Worker 
1082*795d594fSAndroid Build Coastguard Worker   {
1083*795d594fSAndroid Build Coastguard Worker     // To check Contains.
1084*795d594fSAndroid Build Coastguard Worker     MutexLock mu(self, *Locks::thread_list_lock_);
1085*795d594fSAndroid Build Coastguard Worker     // To check IsSuspended.
1086*795d594fSAndroid Build Coastguard Worker     MutexLock mu2(self, *Locks::thread_suspend_count_lock_);
1087*795d594fSAndroid Build Coastguard Worker     if (UNLIKELY(!thread->IsSuspended())) {
1088*795d594fSAndroid Build Coastguard Worker       LOG(reason == SuspendReason::kForUserCode ? ERROR : FATAL)
1089*795d594fSAndroid Build Coastguard Worker           << "Resume(" << reinterpret_cast<void*>(thread) << ") thread not suspended";
1090*795d594fSAndroid Build Coastguard Worker       return false;
1091*795d594fSAndroid Build Coastguard Worker     }
1092*795d594fSAndroid Build Coastguard Worker     if (!Contains(thread)) {
1093*795d594fSAndroid Build Coastguard Worker       // We only expect threads within the thread-list to have been suspended otherwise we can't
1094*795d594fSAndroid Build Coastguard Worker       // stop such threads from delete-ing themselves.
1095*795d594fSAndroid Build Coastguard Worker       LOG(reason == SuspendReason::kForUserCode ? ERROR : FATAL)
1096*795d594fSAndroid Build Coastguard Worker           << "Resume(" << reinterpret_cast<void*>(thread) << ") thread not within thread list";
1097*795d594fSAndroid Build Coastguard Worker       return false;
1098*795d594fSAndroid Build Coastguard Worker     }
1099*795d594fSAndroid Build Coastguard Worker     thread->DecrementSuspendCount(self, /*for_user_code=*/(reason == SuspendReason::kForUserCode));
1100*795d594fSAndroid Build Coastguard Worker     Thread::resume_cond_->Broadcast(self);
1101*795d594fSAndroid Build Coastguard Worker   }
1102*795d594fSAndroid Build Coastguard Worker 
1103*795d594fSAndroid Build Coastguard Worker   VLOG(threads) << "Resume(" << reinterpret_cast<void*>(thread) << ") finished waking others";
1104*795d594fSAndroid Build Coastguard Worker   return true;
1105*795d594fSAndroid Build Coastguard Worker }
1106*795d594fSAndroid Build Coastguard Worker 
SuspendThread(Thread * self,Thread * thread,SuspendReason reason,ThreadState self_state,const char * func_name,int attempt_of_4)1107*795d594fSAndroid Build Coastguard Worker bool ThreadList::SuspendThread(Thread* self,
1108*795d594fSAndroid Build Coastguard Worker                                Thread* thread,
1109*795d594fSAndroid Build Coastguard Worker                                SuspendReason reason,
1110*795d594fSAndroid Build Coastguard Worker                                ThreadState self_state,
1111*795d594fSAndroid Build Coastguard Worker                                const char* func_name,
1112*795d594fSAndroid Build Coastguard Worker                                int attempt_of_4) {
1113*795d594fSAndroid Build Coastguard Worker   bool is_suspended = false;
1114*795d594fSAndroid Build Coastguard Worker   VLOG(threads) << func_name << "starting";
1115*795d594fSAndroid Build Coastguard Worker   pid_t tid = thread->GetTid();
1116*795d594fSAndroid Build Coastguard Worker   uint8_t suspended_count;
1117*795d594fSAndroid Build Coastguard Worker   uint8_t checkpoint_count;
1118*795d594fSAndroid Build Coastguard Worker   WrappedSuspend1Barrier wrapped_barrier{};
1119*795d594fSAndroid Build Coastguard Worker   static_assert(sizeof wrapped_barrier.barrier_ == sizeof(uint32_t));
1120*795d594fSAndroid Build Coastguard Worker   ThreadExitFlag tef;
1121*795d594fSAndroid Build Coastguard Worker   bool exited = false;
1122*795d594fSAndroid Build Coastguard Worker   thread->NotifyOnThreadExit(&tef);
1123*795d594fSAndroid Build Coastguard Worker   int iter_count = 1;
1124*795d594fSAndroid Build Coastguard Worker   do {
1125*795d594fSAndroid Build Coastguard Worker     {
1126*795d594fSAndroid Build Coastguard Worker       Locks::mutator_lock_->AssertSharedHeld(self);
1127*795d594fSAndroid Build Coastguard Worker       Locks::thread_list_lock_->AssertHeld(self);
1128*795d594fSAndroid Build Coastguard Worker       // Note: this will transition to runnable and potentially suspend.
1129*795d594fSAndroid Build Coastguard Worker       DCHECK(Contains(thread));
1130*795d594fSAndroid Build Coastguard Worker       // This implementation fails if thread == self. Let the clients handle that case
1131*795d594fSAndroid Build Coastguard Worker       // appropriately.
1132*795d594fSAndroid Build Coastguard Worker       CHECK_NE(thread, self) << func_name << "(self)";
1133*795d594fSAndroid Build Coastguard Worker       VLOG(threads) << func_name << " suspending: " << *thread;
1134*795d594fSAndroid Build Coastguard Worker       {
1135*795d594fSAndroid Build Coastguard Worker         MutexLock suspend_count_mu(self, *Locks::thread_suspend_count_lock_);
1136*795d594fSAndroid Build Coastguard Worker         if (LIKELY(self->GetSuspendCount() == 0)) {
1137*795d594fSAndroid Build Coastguard Worker           suspended_count = thread->suspended_count_;
1138*795d594fSAndroid Build Coastguard Worker           checkpoint_count = thread->checkpoint_count_;
1139*795d594fSAndroid Build Coastguard Worker           thread->IncrementSuspendCount(self, nullptr, &wrapped_barrier, reason);
1140*795d594fSAndroid Build Coastguard Worker           if (thread->IsSuspended()) {
1141*795d594fSAndroid Build Coastguard Worker             // See the discussion in mutator_gc_coord.md and SuspendAllInternal for the race here.
1142*795d594fSAndroid Build Coastguard Worker             thread->RemoveFirstSuspend1Barrier(&wrapped_barrier);
1143*795d594fSAndroid Build Coastguard Worker             // PassActiveSuspendBarriers couldn't have seen our barrier, since it also acquires
1144*795d594fSAndroid Build Coastguard Worker             // 'thread_suspend_count_lock_'. `wrapped_barrier` will not be accessed.
1145*795d594fSAndroid Build Coastguard Worker             if (!thread->HasActiveSuspendBarrier()) {
1146*795d594fSAndroid Build Coastguard Worker               thread->AtomicClearFlag(ThreadFlag::kActiveSuspendBarrier);
1147*795d594fSAndroid Build Coastguard Worker             }
1148*795d594fSAndroid Build Coastguard Worker             is_suspended = true;
1149*795d594fSAndroid Build Coastguard Worker           }
1150*795d594fSAndroid Build Coastguard Worker           DCHECK_GT(thread->GetSuspendCount(), 0);
1151*795d594fSAndroid Build Coastguard Worker           break;
1152*795d594fSAndroid Build Coastguard Worker         }
1153*795d594fSAndroid Build Coastguard Worker         // Else we hold the suspend count lock but another thread is trying to suspend us,
1154*795d594fSAndroid Build Coastguard Worker         // making it unsafe to try to suspend another thread in case we get a cycle.
1155*795d594fSAndroid Build Coastguard Worker         // Start the loop again, which will allow this thread to be suspended.
1156*795d594fSAndroid Build Coastguard Worker       }
1157*795d594fSAndroid Build Coastguard Worker     }
1158*795d594fSAndroid Build Coastguard Worker     // All locks are released, and we should quickly exit the suspend-unfriendly state. Retry.
1159*795d594fSAndroid Build Coastguard Worker     if (iter_count >= kMaxSuspendRetries) {
1160*795d594fSAndroid Build Coastguard Worker       LOG(FATAL) << "Too many suspend retries";
1161*795d594fSAndroid Build Coastguard Worker     }
1162*795d594fSAndroid Build Coastguard Worker     Locks::thread_list_lock_->ExclusiveUnlock(self);
1163*795d594fSAndroid Build Coastguard Worker     {
1164*795d594fSAndroid Build Coastguard Worker       ScopedThreadSuspension sts(self, ThreadState::kSuspended);
1165*795d594fSAndroid Build Coastguard Worker       usleep(kThreadSuspendSleepUs);
1166*795d594fSAndroid Build Coastguard Worker       ++iter_count;
1167*795d594fSAndroid Build Coastguard Worker     }
1168*795d594fSAndroid Build Coastguard Worker     Locks::thread_list_lock_->ExclusiveLock(self);
1169*795d594fSAndroid Build Coastguard Worker     exited = tef.HasExited();
1170*795d594fSAndroid Build Coastguard Worker   } while (!exited);
1171*795d594fSAndroid Build Coastguard Worker   thread->UnregisterThreadExitFlag(&tef);
1172*795d594fSAndroid Build Coastguard Worker   Locks::thread_list_lock_->ExclusiveUnlock(self);
1173*795d594fSAndroid Build Coastguard Worker   self->TransitionFromRunnableToSuspended(self_state);
1174*795d594fSAndroid Build Coastguard Worker   if (exited) {
1175*795d594fSAndroid Build Coastguard Worker     // This is OK: There's a race in inflating a lock and the owner giving up ownership and then
1176*795d594fSAndroid Build Coastguard Worker     // dying.
1177*795d594fSAndroid Build Coastguard Worker     LOG(WARNING) << StringPrintf("Thread with tid %d exited before suspending", tid);
1178*795d594fSAndroid Build Coastguard Worker     return false;
1179*795d594fSAndroid Build Coastguard Worker   }
1180*795d594fSAndroid Build Coastguard Worker   // Now wait for target to decrement suspend barrier.
1181*795d594fSAndroid Build Coastguard Worker   std::optional<std::string> failure_info;
1182*795d594fSAndroid Build Coastguard Worker   if (!is_suspended) {
1183*795d594fSAndroid Build Coastguard Worker     failure_info = WaitForSuspendBarrier(&wrapped_barrier.barrier_, tid, attempt_of_4);
1184*795d594fSAndroid Build Coastguard Worker     if (!failure_info.has_value()) {
1185*795d594fSAndroid Build Coastguard Worker       is_suspended = true;
1186*795d594fSAndroid Build Coastguard Worker     }
1187*795d594fSAndroid Build Coastguard Worker   }
1188*795d594fSAndroid Build Coastguard Worker   while (!is_suspended) {
1189*795d594fSAndroid Build Coastguard Worker     if (attempt_of_4 > 0 && attempt_of_4 < 4) {
1190*795d594fSAndroid Build Coastguard Worker       // Caller will try again. Give up and resume the thread for now.  We need to make sure
1191*795d594fSAndroid Build Coastguard Worker       // that wrapped_barrier is removed from the list before we deallocate it.
1192*795d594fSAndroid Build Coastguard Worker       MutexLock suspend_count_mu(self, *Locks::thread_suspend_count_lock_);
1193*795d594fSAndroid Build Coastguard Worker       if (wrapped_barrier.barrier_.load() == 0) {
1194*795d594fSAndroid Build Coastguard Worker         // Succeeded in the meantime.
1195*795d594fSAndroid Build Coastguard Worker         is_suspended = true;
1196*795d594fSAndroid Build Coastguard Worker         continue;
1197*795d594fSAndroid Build Coastguard Worker       }
1198*795d594fSAndroid Build Coastguard Worker       thread->RemoveSuspend1Barrier(&wrapped_barrier);
1199*795d594fSAndroid Build Coastguard Worker       if (!thread->HasActiveSuspendBarrier()) {
1200*795d594fSAndroid Build Coastguard Worker         thread->AtomicClearFlag(ThreadFlag::kActiveSuspendBarrier);
1201*795d594fSAndroid Build Coastguard Worker       }
1202*795d594fSAndroid Build Coastguard Worker       // Do not call Resume(), since we are probably not fully suspended.
1203*795d594fSAndroid Build Coastguard Worker       thread->DecrementSuspendCount(self,
1204*795d594fSAndroid Build Coastguard Worker                                     /*for_user_code=*/(reason == SuspendReason::kForUserCode));
1205*795d594fSAndroid Build Coastguard Worker       Thread::resume_cond_->Broadcast(self);
1206*795d594fSAndroid Build Coastguard Worker       return false;
1207*795d594fSAndroid Build Coastguard Worker     }
1208*795d594fSAndroid Build Coastguard Worker     std::string name;
1209*795d594fSAndroid Build Coastguard Worker     thread->GetThreadName(name);
1210*795d594fSAndroid Build Coastguard Worker     WrappedSuspend1Barrier* first_barrier;
1211*795d594fSAndroid Build Coastguard Worker     {
1212*795d594fSAndroid Build Coastguard Worker       MutexLock suspend_count_mu(self, *Locks::thread_suspend_count_lock_);
1213*795d594fSAndroid Build Coastguard Worker       first_barrier = thread->tlsPtr_.active_suspend1_barriers;
1214*795d594fSAndroid Build Coastguard Worker     }
1215*795d594fSAndroid Build Coastguard Worker     // 'thread' should still have a suspend request pending, and hence stick around. Try to abort
1216*795d594fSAndroid Build Coastguard Worker     // there, since its stack trace is much more interesting than ours.
1217*795d594fSAndroid Build Coastguard Worker     std::string message = StringPrintf(
1218*795d594fSAndroid Build Coastguard Worker         "%s timed out: %s: state&flags: 0x%x, Java/native priority: %d/%d,"
1219*795d594fSAndroid Build Coastguard Worker         " barriers: %p, ours: %p, barrier value: %d, nsusps: %d, ncheckpts: %d, thread_info: %s",
1220*795d594fSAndroid Build Coastguard Worker         func_name,
1221*795d594fSAndroid Build Coastguard Worker         name.c_str(),
1222*795d594fSAndroid Build Coastguard Worker         thread->GetStateAndFlags(std::memory_order_relaxed).GetValue(),
1223*795d594fSAndroid Build Coastguard Worker         thread->GetNativePriority(),
1224*795d594fSAndroid Build Coastguard Worker         getpriority(PRIO_PROCESS /* really thread */, thread->GetTid()),
1225*795d594fSAndroid Build Coastguard Worker         first_barrier,
1226*795d594fSAndroid Build Coastguard Worker         &wrapped_barrier,
1227*795d594fSAndroid Build Coastguard Worker         wrapped_barrier.barrier_.load(),
1228*795d594fSAndroid Build Coastguard Worker         thread->suspended_count_ - suspended_count,
1229*795d594fSAndroid Build Coastguard Worker         thread->checkpoint_count_ - checkpoint_count,
1230*795d594fSAndroid Build Coastguard Worker         failure_info.value().c_str());
1231*795d594fSAndroid Build Coastguard Worker     // Check one last time whether thread passed the suspend barrier. Empirically this seems to
1232*795d594fSAndroid Build Coastguard Worker     // happen maybe between 1 and 5% of the time.
1233*795d594fSAndroid Build Coastguard Worker     if (wrapped_barrier.barrier_.load() != 0) {
1234*795d594fSAndroid Build Coastguard Worker       // thread still has a pointer to wrapped_barrier. Returning and continuing would be unsafe
1235*795d594fSAndroid Build Coastguard Worker       // without additional cleanup.
1236*795d594fSAndroid Build Coastguard Worker       thread->AbortInThis(message);
1237*795d594fSAndroid Build Coastguard Worker       UNREACHABLE();
1238*795d594fSAndroid Build Coastguard Worker     }
1239*795d594fSAndroid Build Coastguard Worker     is_suspended = true;
1240*795d594fSAndroid Build Coastguard Worker   }
1241*795d594fSAndroid Build Coastguard Worker   // wrapped_barrier.barrier_ will no longer be accessed.
1242*795d594fSAndroid Build Coastguard Worker   VLOG(threads) << func_name << " suspended: " << *thread;
1243*795d594fSAndroid Build Coastguard Worker   if (ATraceEnabled()) {
1244*795d594fSAndroid Build Coastguard Worker     std::string name;
1245*795d594fSAndroid Build Coastguard Worker     thread->GetThreadName(name);
1246*795d594fSAndroid Build Coastguard Worker     ATraceBegin(
1247*795d594fSAndroid Build Coastguard Worker         StringPrintf("%s suspended %s for tid=%d", func_name, name.c_str(), thread->GetTid())
1248*795d594fSAndroid Build Coastguard Worker             .c_str());
1249*795d594fSAndroid Build Coastguard Worker   }
1250*795d594fSAndroid Build Coastguard Worker   if (kIsDebugBuild) {
1251*795d594fSAndroid Build Coastguard Worker     CHECK(thread->IsSuspended());
1252*795d594fSAndroid Build Coastguard Worker     MutexLock suspend_count_mu(self, *Locks::thread_suspend_count_lock_);
1253*795d594fSAndroid Build Coastguard Worker     thread->CheckBarrierInactive(&wrapped_barrier);
1254*795d594fSAndroid Build Coastguard Worker   }
1255*795d594fSAndroid Build Coastguard Worker   return true;
1256*795d594fSAndroid Build Coastguard Worker }
1257*795d594fSAndroid Build Coastguard Worker 
SuspendThreadByPeer(jobject peer,SuspendReason reason)1258*795d594fSAndroid Build Coastguard Worker Thread* ThreadList::SuspendThreadByPeer(jobject peer, SuspendReason reason) {
1259*795d594fSAndroid Build Coastguard Worker   Thread* const self = Thread::Current();
1260*795d594fSAndroid Build Coastguard Worker   ThreadState old_self_state = self->GetState();
1261*795d594fSAndroid Build Coastguard Worker   self->TransitionFromSuspendedToRunnable();
1262*795d594fSAndroid Build Coastguard Worker   Locks::thread_list_lock_->ExclusiveLock(self);
1263*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Object> thread_ptr = self->DecodeJObject(peer);
1264*795d594fSAndroid Build Coastguard Worker   Thread* thread = Thread::FromManagedThread(self, thread_ptr);
1265*795d594fSAndroid Build Coastguard Worker   if (thread == nullptr || !Contains(thread)) {
1266*795d594fSAndroid Build Coastguard Worker     if (thread == nullptr) {
1267*795d594fSAndroid Build Coastguard Worker       ObjPtr<mirror::Object> name = WellKnownClasses::java_lang_Thread_name->GetObject(thread_ptr);
1268*795d594fSAndroid Build Coastguard Worker       std::string thr_name = (name == nullptr ? "<unknown>" : name->AsString()->ToModifiedUtf8());
1269*795d594fSAndroid Build Coastguard Worker       LOG(WARNING) << "No such thread for suspend"
1270*795d594fSAndroid Build Coastguard Worker                    << ": " << peer << ":" << thr_name;
1271*795d594fSAndroid Build Coastguard Worker     } else {
1272*795d594fSAndroid Build Coastguard Worker       LOG(WARNING) << "SuspendThreadByPeer failed for unattached thread: "
1273*795d594fSAndroid Build Coastguard Worker                    << reinterpret_cast<void*>(thread);
1274*795d594fSAndroid Build Coastguard Worker     }
1275*795d594fSAndroid Build Coastguard Worker     Locks::thread_list_lock_->ExclusiveUnlock(self);
1276*795d594fSAndroid Build Coastguard Worker     self->TransitionFromRunnableToSuspended(old_self_state);
1277*795d594fSAndroid Build Coastguard Worker     return nullptr;
1278*795d594fSAndroid Build Coastguard Worker   }
1279*795d594fSAndroid Build Coastguard Worker   VLOG(threads) << "SuspendThreadByPeer found thread: " << *thread;
1280*795d594fSAndroid Build Coastguard Worker   // Releases thread_list_lock_ and mutator lock.
1281*795d594fSAndroid Build Coastguard Worker   bool success = SuspendThread(self, thread, reason, old_self_state, __func__, 0);
1282*795d594fSAndroid Build Coastguard Worker   Locks::thread_list_lock_->AssertNotHeld(self);
1283*795d594fSAndroid Build Coastguard Worker   return success ? thread : nullptr;
1284*795d594fSAndroid Build Coastguard Worker }
1285*795d594fSAndroid Build Coastguard Worker 
SuspendThreadByThreadId(uint32_t thread_id,SuspendReason reason,int attempt_of_4)1286*795d594fSAndroid Build Coastguard Worker Thread* ThreadList::SuspendThreadByThreadId(uint32_t thread_id,
1287*795d594fSAndroid Build Coastguard Worker                                             SuspendReason reason,
1288*795d594fSAndroid Build Coastguard Worker                                             int attempt_of_4) {
1289*795d594fSAndroid Build Coastguard Worker   Thread* const self = Thread::Current();
1290*795d594fSAndroid Build Coastguard Worker   ThreadState old_self_state = self->GetState();
1291*795d594fSAndroid Build Coastguard Worker   CHECK_NE(thread_id, kInvalidThreadId);
1292*795d594fSAndroid Build Coastguard Worker   VLOG(threads) << "SuspendThreadByThreadId starting";
1293*795d594fSAndroid Build Coastguard Worker   self->TransitionFromSuspendedToRunnable();
1294*795d594fSAndroid Build Coastguard Worker   Locks::thread_list_lock_->ExclusiveLock(self);
1295*795d594fSAndroid Build Coastguard Worker   Thread* thread = FindThreadByThreadId(thread_id);
1296*795d594fSAndroid Build Coastguard Worker   if (thread == nullptr) {
1297*795d594fSAndroid Build Coastguard Worker     // There's a race in inflating a lock and the owner giving up ownership and then dying.
1298*795d594fSAndroid Build Coastguard Worker     LOG(WARNING) << StringPrintf("No such thread id %d for suspend", thread_id);
1299*795d594fSAndroid Build Coastguard Worker     Locks::thread_list_lock_->ExclusiveUnlock(self);
1300*795d594fSAndroid Build Coastguard Worker     self->TransitionFromRunnableToSuspended(old_self_state);
1301*795d594fSAndroid Build Coastguard Worker     return nullptr;
1302*795d594fSAndroid Build Coastguard Worker   }
1303*795d594fSAndroid Build Coastguard Worker   DCHECK(Contains(thread));
1304*795d594fSAndroid Build Coastguard Worker   VLOG(threads) << "SuspendThreadByThreadId found thread: " << *thread;
1305*795d594fSAndroid Build Coastguard Worker   // Releases thread_list_lock_ and mutator lock.
1306*795d594fSAndroid Build Coastguard Worker   bool success = SuspendThread(self, thread, reason, old_self_state, __func__, attempt_of_4);
1307*795d594fSAndroid Build Coastguard Worker   Locks::thread_list_lock_->AssertNotHeld(self);
1308*795d594fSAndroid Build Coastguard Worker   return success ? thread : nullptr;
1309*795d594fSAndroid Build Coastguard Worker }
1310*795d594fSAndroid Build Coastguard Worker 
FindThreadByThreadId(uint32_t thread_id)1311*795d594fSAndroid Build Coastguard Worker Thread* ThreadList::FindThreadByThreadId(uint32_t thread_id) {
1312*795d594fSAndroid Build Coastguard Worker   for (const auto& thread : list_) {
1313*795d594fSAndroid Build Coastguard Worker     if (thread->GetThreadId() == thread_id) {
1314*795d594fSAndroid Build Coastguard Worker       return thread;
1315*795d594fSAndroid Build Coastguard Worker     }
1316*795d594fSAndroid Build Coastguard Worker   }
1317*795d594fSAndroid Build Coastguard Worker   return nullptr;
1318*795d594fSAndroid Build Coastguard Worker }
1319*795d594fSAndroid Build Coastguard Worker 
FindThreadByTid(int tid)1320*795d594fSAndroid Build Coastguard Worker Thread* ThreadList::FindThreadByTid(int tid) {
1321*795d594fSAndroid Build Coastguard Worker   for (const auto& thread : list_) {
1322*795d594fSAndroid Build Coastguard Worker     if (thread->GetTid() == tid) {
1323*795d594fSAndroid Build Coastguard Worker       return thread;
1324*795d594fSAndroid Build Coastguard Worker     }
1325*795d594fSAndroid Build Coastguard Worker   }
1326*795d594fSAndroid Build Coastguard Worker   return nullptr;
1327*795d594fSAndroid Build Coastguard Worker }
1328*795d594fSAndroid Build Coastguard Worker 
WaitForOtherNonDaemonThreadsToExit(bool check_no_birth)1329*795d594fSAndroid Build Coastguard Worker void ThreadList::WaitForOtherNonDaemonThreadsToExit(bool check_no_birth) {
1330*795d594fSAndroid Build Coastguard Worker   ScopedTrace trace(__PRETTY_FUNCTION__);
1331*795d594fSAndroid Build Coastguard Worker   Thread* self = Thread::Current();
1332*795d594fSAndroid Build Coastguard Worker   Locks::mutator_lock_->AssertNotHeld(self);
1333*795d594fSAndroid Build Coastguard Worker   while (true) {
1334*795d594fSAndroid Build Coastguard Worker     Locks::runtime_shutdown_lock_->Lock(self);
1335*795d594fSAndroid Build Coastguard Worker     if (check_no_birth) {
1336*795d594fSAndroid Build Coastguard Worker       // No more threads can be born after we start to shutdown.
1337*795d594fSAndroid Build Coastguard Worker       CHECK(Runtime::Current()->IsShuttingDownLocked());
1338*795d594fSAndroid Build Coastguard Worker       CHECK_EQ(Runtime::Current()->NumberOfThreadsBeingBorn(), 0U);
1339*795d594fSAndroid Build Coastguard Worker     } else {
1340*795d594fSAndroid Build Coastguard Worker       if (Runtime::Current()->NumberOfThreadsBeingBorn() != 0U) {
1341*795d594fSAndroid Build Coastguard Worker         // Awkward. Shutdown_cond_ is private, but the only live thread may not be registered yet.
1342*795d594fSAndroid Build Coastguard Worker         // Fortunately, this is used mostly for testing, and not performance-critical.
1343*795d594fSAndroid Build Coastguard Worker         Locks::runtime_shutdown_lock_->Unlock(self);
1344*795d594fSAndroid Build Coastguard Worker         usleep(1000);
1345*795d594fSAndroid Build Coastguard Worker         continue;
1346*795d594fSAndroid Build Coastguard Worker       }
1347*795d594fSAndroid Build Coastguard Worker     }
1348*795d594fSAndroid Build Coastguard Worker     MutexLock mu(self, *Locks::thread_list_lock_);
1349*795d594fSAndroid Build Coastguard Worker     Locks::runtime_shutdown_lock_->Unlock(self);
1350*795d594fSAndroid Build Coastguard Worker     // Also wait for any threads that are unregistering to finish. This is required so that no
1351*795d594fSAndroid Build Coastguard Worker     // threads access the thread list after it is deleted. TODO: This may not work for user daemon
1352*795d594fSAndroid Build Coastguard Worker     // threads since they could unregister at the wrong time.
1353*795d594fSAndroid Build Coastguard Worker     bool done = unregistering_count_ == 0;
1354*795d594fSAndroid Build Coastguard Worker     if (done) {
1355*795d594fSAndroid Build Coastguard Worker       for (const auto& thread : list_) {
1356*795d594fSAndroid Build Coastguard Worker         if (thread != self && !thread->IsDaemon()) {
1357*795d594fSAndroid Build Coastguard Worker           done = false;
1358*795d594fSAndroid Build Coastguard Worker           break;
1359*795d594fSAndroid Build Coastguard Worker         }
1360*795d594fSAndroid Build Coastguard Worker       }
1361*795d594fSAndroid Build Coastguard Worker     }
1362*795d594fSAndroid Build Coastguard Worker     if (done) {
1363*795d594fSAndroid Build Coastguard Worker       break;
1364*795d594fSAndroid Build Coastguard Worker     }
1365*795d594fSAndroid Build Coastguard Worker     // Wait for another thread to exit before re-checking.
1366*795d594fSAndroid Build Coastguard Worker     Locks::thread_exit_cond_->Wait(self);
1367*795d594fSAndroid Build Coastguard Worker   }
1368*795d594fSAndroid Build Coastguard Worker }
1369*795d594fSAndroid Build Coastguard Worker 
SuspendAllDaemonThreadsForShutdown()1370*795d594fSAndroid Build Coastguard Worker void ThreadList::SuspendAllDaemonThreadsForShutdown() {
1371*795d594fSAndroid Build Coastguard Worker   ScopedTrace trace(__PRETTY_FUNCTION__);
1372*795d594fSAndroid Build Coastguard Worker   Thread* self = Thread::Current();
1373*795d594fSAndroid Build Coastguard Worker   size_t daemons_left = 0;
1374*795d594fSAndroid Build Coastguard Worker   {
1375*795d594fSAndroid Build Coastguard Worker     // Tell all the daemons it's time to suspend.
1376*795d594fSAndroid Build Coastguard Worker     MutexLock mu(self, *Locks::thread_list_lock_);
1377*795d594fSAndroid Build Coastguard Worker     MutexLock mu2(self, *Locks::thread_suspend_count_lock_);
1378*795d594fSAndroid Build Coastguard Worker     for (const auto& thread : list_) {
1379*795d594fSAndroid Build Coastguard Worker       // This is only run after all non-daemon threads have exited, so the remainder should all be
1380*795d594fSAndroid Build Coastguard Worker       // daemons.
1381*795d594fSAndroid Build Coastguard Worker       CHECK(thread->IsDaemon()) << *thread;
1382*795d594fSAndroid Build Coastguard Worker       if (thread != self) {
1383*795d594fSAndroid Build Coastguard Worker         thread->IncrementSuspendCount(self);
1384*795d594fSAndroid Build Coastguard Worker         ++daemons_left;
1385*795d594fSAndroid Build Coastguard Worker       }
1386*795d594fSAndroid Build Coastguard Worker       // We are shutting down the runtime, set the JNI functions of all the JNIEnvs to be
1387*795d594fSAndroid Build Coastguard Worker       // the sleep forever one.
1388*795d594fSAndroid Build Coastguard Worker       thread->GetJniEnv()->SetFunctionsToRuntimeShutdownFunctions();
1389*795d594fSAndroid Build Coastguard Worker     }
1390*795d594fSAndroid Build Coastguard Worker   }
1391*795d594fSAndroid Build Coastguard Worker   if (daemons_left == 0) {
1392*795d594fSAndroid Build Coastguard Worker     // No threads left; safe to shut down.
1393*795d594fSAndroid Build Coastguard Worker     return;
1394*795d594fSAndroid Build Coastguard Worker   }
1395*795d594fSAndroid Build Coastguard Worker   // There is not a clean way to shut down if we have daemons left. We have no mechanism for
1396*795d594fSAndroid Build Coastguard Worker   // killing them and reclaiming thread stacks. We also have no mechanism for waiting until they
1397*795d594fSAndroid Build Coastguard Worker   // have truly finished touching the memory we are about to deallocate. We do the best we can with
1398*795d594fSAndroid Build Coastguard Worker   // timeouts.
1399*795d594fSAndroid Build Coastguard Worker   //
1400*795d594fSAndroid Build Coastguard Worker   // If we have any daemons left, wait until they are (a) suspended and (b) they are not stuck
1401*795d594fSAndroid Build Coastguard Worker   // in a place where they are about to access runtime state and are not in a runnable state.
1402*795d594fSAndroid Build Coastguard Worker   // We attempt to do the latter by just waiting long enough for things to
1403*795d594fSAndroid Build Coastguard Worker   // quiesce. Examples: Monitor code or waking up from a condition variable.
1404*795d594fSAndroid Build Coastguard Worker   //
1405*795d594fSAndroid Build Coastguard Worker   // Give the threads a chance to suspend, complaining if they're slow. (a)
1406*795d594fSAndroid Build Coastguard Worker   bool have_complained = false;
1407*795d594fSAndroid Build Coastguard Worker   static constexpr size_t kTimeoutMicroseconds = 2000 * 1000;
1408*795d594fSAndroid Build Coastguard Worker   static constexpr size_t kSleepMicroseconds = 1000;
1409*795d594fSAndroid Build Coastguard Worker   bool all_suspended = false;
1410*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; !all_suspended && i < kTimeoutMicroseconds / kSleepMicroseconds; ++i) {
1411*795d594fSAndroid Build Coastguard Worker     bool found_running = false;
1412*795d594fSAndroid Build Coastguard Worker     {
1413*795d594fSAndroid Build Coastguard Worker       MutexLock mu(self, *Locks::thread_list_lock_);
1414*795d594fSAndroid Build Coastguard Worker       for (const auto& thread : list_) {
1415*795d594fSAndroid Build Coastguard Worker         if (thread != self && thread->GetState() == ThreadState::kRunnable) {
1416*795d594fSAndroid Build Coastguard Worker           if (!have_complained) {
1417*795d594fSAndroid Build Coastguard Worker             LOG(WARNING) << "daemon thread not yet suspended: " << *thread;
1418*795d594fSAndroid Build Coastguard Worker             have_complained = true;
1419*795d594fSAndroid Build Coastguard Worker           }
1420*795d594fSAndroid Build Coastguard Worker           found_running = true;
1421*795d594fSAndroid Build Coastguard Worker         }
1422*795d594fSAndroid Build Coastguard Worker       }
1423*795d594fSAndroid Build Coastguard Worker     }
1424*795d594fSAndroid Build Coastguard Worker     if (found_running) {
1425*795d594fSAndroid Build Coastguard Worker       // Sleep briefly before checking again. Max total sleep time is kTimeoutMicroseconds.
1426*795d594fSAndroid Build Coastguard Worker       usleep(kSleepMicroseconds);
1427*795d594fSAndroid Build Coastguard Worker     } else {
1428*795d594fSAndroid Build Coastguard Worker       all_suspended = true;
1429*795d594fSAndroid Build Coastguard Worker     }
1430*795d594fSAndroid Build Coastguard Worker   }
1431*795d594fSAndroid Build Coastguard Worker   if (!all_suspended) {
1432*795d594fSAndroid Build Coastguard Worker     // We can get here if a daemon thread executed a fastnative native call, so that it
1433*795d594fSAndroid Build Coastguard Worker     // remained in runnable state, and then made a JNI call after we called
1434*795d594fSAndroid Build Coastguard Worker     // SetFunctionsToRuntimeShutdownFunctions(), causing it to permanently stay in a harmless
1435*795d594fSAndroid Build Coastguard Worker     // but runnable state. See b/147804269 .
1436*795d594fSAndroid Build Coastguard Worker     LOG(WARNING) << "timed out suspending all daemon threads";
1437*795d594fSAndroid Build Coastguard Worker   }
1438*795d594fSAndroid Build Coastguard Worker   // Assume all threads are either suspended or somehow wedged.
1439*795d594fSAndroid Build Coastguard Worker   // Wait again for all the now "suspended" threads to actually quiesce. (b)
1440*795d594fSAndroid Build Coastguard Worker   static constexpr size_t kDaemonSleepTime = 400'000;
1441*795d594fSAndroid Build Coastguard Worker   usleep(kDaemonSleepTime);
1442*795d594fSAndroid Build Coastguard Worker   std::list<Thread*> list_copy;
1443*795d594fSAndroid Build Coastguard Worker   {
1444*795d594fSAndroid Build Coastguard Worker     MutexLock mu(self, *Locks::thread_list_lock_);
1445*795d594fSAndroid Build Coastguard Worker     // Half-way through the wait, set the "runtime deleted" flag, causing any newly awoken
1446*795d594fSAndroid Build Coastguard Worker     // threads to immediately go back to sleep without touching memory. This prevents us from
1447*795d594fSAndroid Build Coastguard Worker     // touching deallocated memory, but it also prevents mutexes from getting released. Thus we
1448*795d594fSAndroid Build Coastguard Worker     // only do this once we're reasonably sure that no system mutexes are still held.
1449*795d594fSAndroid Build Coastguard Worker     for (const auto& thread : list_) {
1450*795d594fSAndroid Build Coastguard Worker       DCHECK(thread == self || !all_suspended || thread->GetState() != ThreadState::kRunnable);
1451*795d594fSAndroid Build Coastguard Worker       // In the !all_suspended case, the target is probably sleeping.
1452*795d594fSAndroid Build Coastguard Worker       thread->GetJniEnv()->SetRuntimeDeleted();
1453*795d594fSAndroid Build Coastguard Worker       // Possibly contended Mutex acquisitions are unsafe after this.
1454*795d594fSAndroid Build Coastguard Worker       // Releasing thread_list_lock_ is OK, since it can't block.
1455*795d594fSAndroid Build Coastguard Worker     }
1456*795d594fSAndroid Build Coastguard Worker   }
1457*795d594fSAndroid Build Coastguard Worker   // Finally wait for any threads woken before we set the "runtime deleted" flags to finish
1458*795d594fSAndroid Build Coastguard Worker   // touching memory.
1459*795d594fSAndroid Build Coastguard Worker   usleep(kDaemonSleepTime);
1460*795d594fSAndroid Build Coastguard Worker #if defined(__has_feature)
1461*795d594fSAndroid Build Coastguard Worker #if __has_feature(address_sanitizer) || __has_feature(hwaddress_sanitizer)
1462*795d594fSAndroid Build Coastguard Worker   // Sleep a bit longer with -fsanitize=address, since everything is slower.
1463*795d594fSAndroid Build Coastguard Worker   usleep(2 * kDaemonSleepTime);
1464*795d594fSAndroid Build Coastguard Worker #endif
1465*795d594fSAndroid Build Coastguard Worker #endif
1466*795d594fSAndroid Build Coastguard Worker   // At this point no threads should be touching our data structures anymore.
1467*795d594fSAndroid Build Coastguard Worker }
1468*795d594fSAndroid Build Coastguard Worker 
Register(Thread * self)1469*795d594fSAndroid Build Coastguard Worker void ThreadList::Register(Thread* self) {
1470*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(self, Thread::Current());
1471*795d594fSAndroid Build Coastguard Worker   CHECK(!shut_down_);
1472*795d594fSAndroid Build Coastguard Worker 
1473*795d594fSAndroid Build Coastguard Worker   if (VLOG_IS_ON(threads)) {
1474*795d594fSAndroid Build Coastguard Worker     std::ostringstream oss;
1475*795d594fSAndroid Build Coastguard Worker     self->ShortDump(oss);  // We don't hold the mutator_lock_ yet and so cannot call Dump.
1476*795d594fSAndroid Build Coastguard Worker     LOG(INFO) << "ThreadList::Register() " << *self  << "\n" << oss.str();
1477*795d594fSAndroid Build Coastguard Worker   }
1478*795d594fSAndroid Build Coastguard Worker 
1479*795d594fSAndroid Build Coastguard Worker   // Atomically add self to the thread list and make its thread_suspend_count_ reflect ongoing
1480*795d594fSAndroid Build Coastguard Worker   // SuspendAll requests.
1481*795d594fSAndroid Build Coastguard Worker   MutexLock mu(self, *Locks::thread_list_lock_);
1482*795d594fSAndroid Build Coastguard Worker   MutexLock mu2(self, *Locks::thread_suspend_count_lock_);
1483*795d594fSAndroid Build Coastguard Worker   if (suspend_all_count_ == 1) {
1484*795d594fSAndroid Build Coastguard Worker     self->IncrementSuspendCount(self);
1485*795d594fSAndroid Build Coastguard Worker   } else {
1486*795d594fSAndroid Build Coastguard Worker     DCHECK_EQ(suspend_all_count_, 0);
1487*795d594fSAndroid Build Coastguard Worker   }
1488*795d594fSAndroid Build Coastguard Worker   CHECK(!Contains(self));
1489*795d594fSAndroid Build Coastguard Worker   list_.push_back(self);
1490*795d594fSAndroid Build Coastguard Worker   if (gUseReadBarrier) {
1491*795d594fSAndroid Build Coastguard Worker     gc::collector::ConcurrentCopying* const cc =
1492*795d594fSAndroid Build Coastguard Worker         Runtime::Current()->GetHeap()->ConcurrentCopyingCollector();
1493*795d594fSAndroid Build Coastguard Worker     // Initialize according to the state of the CC collector.
1494*795d594fSAndroid Build Coastguard Worker     self->SetIsGcMarkingAndUpdateEntrypoints(cc->IsMarking());
1495*795d594fSAndroid Build Coastguard Worker     if (cc->IsUsingReadBarrierEntrypoints()) {
1496*795d594fSAndroid Build Coastguard Worker       self->SetReadBarrierEntrypoints();
1497*795d594fSAndroid Build Coastguard Worker     }
1498*795d594fSAndroid Build Coastguard Worker     self->SetWeakRefAccessEnabled(cc->IsWeakRefAccessEnabled());
1499*795d594fSAndroid Build Coastguard Worker   }
1500*795d594fSAndroid Build Coastguard Worker }
1501*795d594fSAndroid Build Coastguard Worker 
Unregister(Thread * self,bool should_run_callbacks)1502*795d594fSAndroid Build Coastguard Worker void ThreadList::Unregister(Thread* self, bool should_run_callbacks) {
1503*795d594fSAndroid Build Coastguard Worker   DCHECK_EQ(self, Thread::Current());
1504*795d594fSAndroid Build Coastguard Worker   CHECK_NE(self->GetState(), ThreadState::kRunnable);
1505*795d594fSAndroid Build Coastguard Worker   Locks::mutator_lock_->AssertNotHeld(self);
1506*795d594fSAndroid Build Coastguard Worker   if (self->tls32_.disable_thread_flip_count != 0) {
1507*795d594fSAndroid Build Coastguard Worker     LOG(FATAL) << "Incomplete PrimitiveArrayCritical section at exit: " << *self << "count = "
1508*795d594fSAndroid Build Coastguard Worker                << self->tls32_.disable_thread_flip_count;
1509*795d594fSAndroid Build Coastguard Worker   }
1510*795d594fSAndroid Build Coastguard Worker 
1511*795d594fSAndroid Build Coastguard Worker   VLOG(threads) << "ThreadList::Unregister() " << *self;
1512*795d594fSAndroid Build Coastguard Worker 
1513*795d594fSAndroid Build Coastguard Worker   {
1514*795d594fSAndroid Build Coastguard Worker     MutexLock mu(self, *Locks::thread_list_lock_);
1515*795d594fSAndroid Build Coastguard Worker     ++unregistering_count_;
1516*795d594fSAndroid Build Coastguard Worker   }
1517*795d594fSAndroid Build Coastguard Worker 
1518*795d594fSAndroid Build Coastguard Worker   // Any time-consuming destruction, plus anything that can call back into managed code or
1519*795d594fSAndroid Build Coastguard Worker   // suspend and so on, must happen at this point, and not in ~Thread. The self->Destroy is what
1520*795d594fSAndroid Build Coastguard Worker   // causes the threads to join. It is important to do this after incrementing unregistering_count_
1521*795d594fSAndroid Build Coastguard Worker   // since we want the runtime to wait for the daemon threads to exit before deleting the thread
1522*795d594fSAndroid Build Coastguard Worker   // list.
1523*795d594fSAndroid Build Coastguard Worker   self->Destroy(should_run_callbacks);
1524*795d594fSAndroid Build Coastguard Worker 
1525*795d594fSAndroid Build Coastguard Worker   uint32_t thin_lock_id = self->GetThreadId();
1526*795d594fSAndroid Build Coastguard Worker   while (true) {
1527*795d594fSAndroid Build Coastguard Worker     // Remove and delete the Thread* while holding the thread_list_lock_ and
1528*795d594fSAndroid Build Coastguard Worker     // thread_suspend_count_lock_ so that the unregistering thread cannot be suspended.
1529*795d594fSAndroid Build Coastguard Worker     // Note: deliberately not using MutexLock that could hold a stale self pointer.
1530*795d594fSAndroid Build Coastguard Worker     {
1531*795d594fSAndroid Build Coastguard Worker       MutexLock mu(self, *Locks::thread_list_lock_);
1532*795d594fSAndroid Build Coastguard Worker       if (!Contains(self)) {
1533*795d594fSAndroid Build Coastguard Worker         std::string thread_name;
1534*795d594fSAndroid Build Coastguard Worker         self->GetThreadName(thread_name);
1535*795d594fSAndroid Build Coastguard Worker         std::ostringstream os;
1536*795d594fSAndroid Build Coastguard Worker         DumpNativeStack(os, GetTid(), "  native: ", nullptr);
1537*795d594fSAndroid Build Coastguard Worker         LOG(FATAL) << "Request to unregister unattached thread " << thread_name << "\n" << os.str();
1538*795d594fSAndroid Build Coastguard Worker         UNREACHABLE();
1539*795d594fSAndroid Build Coastguard Worker       } else {
1540*795d594fSAndroid Build Coastguard Worker         MutexLock mu2(self, *Locks::thread_suspend_count_lock_);
1541*795d594fSAndroid Build Coastguard Worker         Thread::StateAndFlags state_and_flags = self->GetStateAndFlags(std::memory_order_acquire);
1542*795d594fSAndroid Build Coastguard Worker         if (!state_and_flags.IsFlagSet(ThreadFlag::kRunningFlipFunction) &&
1543*795d594fSAndroid Build Coastguard Worker             !state_and_flags.IsFlagSet(ThreadFlag::kSuspendRequest)) {
1544*795d594fSAndroid Build Coastguard Worker           list_.remove(self);
1545*795d594fSAndroid Build Coastguard Worker           self->SignalExitFlags();
1546*795d594fSAndroid Build Coastguard Worker           break;
1547*795d594fSAndroid Build Coastguard Worker         }
1548*795d594fSAndroid Build Coastguard Worker       }
1549*795d594fSAndroid Build Coastguard Worker     }
1550*795d594fSAndroid Build Coastguard Worker     // In the case where we are not suspended yet, sleep to leave other threads time to execute.
1551*795d594fSAndroid Build Coastguard Worker     // This is important if there are realtime threads. b/111277984
1552*795d594fSAndroid Build Coastguard Worker     usleep(1);
1553*795d594fSAndroid Build Coastguard Worker     // We failed to remove the thread due to a suspend request or the like, loop and try again.
1554*795d594fSAndroid Build Coastguard Worker   }
1555*795d594fSAndroid Build Coastguard Worker 
1556*795d594fSAndroid Build Coastguard Worker   // We flush the trace buffer in Thread::Destroy. We have to check again here because once the
1557*795d594fSAndroid Build Coastguard Worker   // Thread::Destroy finishes we wait for any active suspend requests to finish before deleting
1558*795d594fSAndroid Build Coastguard Worker   // the thread. If a new trace was started during the wait period we may allocate the trace buffer
1559*795d594fSAndroid Build Coastguard Worker   // again. The trace buffer would only contain the method entry events for the methods on the stack
1560*795d594fSAndroid Build Coastguard Worker   // of an exiting thread. It is not required to flush these entries but we need to release the
1561*795d594fSAndroid Build Coastguard Worker   // buffer. Ideally we should either not generate trace events for a thread that is exiting or use
1562*795d594fSAndroid Build Coastguard Worker   // a different mechanism to report the initial events on a trace start that doesn't use per-thread
1563*795d594fSAndroid Build Coastguard Worker   // buffer. Both these approaches are not trivial to implement, so we are going with the approach
1564*795d594fSAndroid Build Coastguard Worker   // of just releasing the buffer here.
1565*795d594fSAndroid Build Coastguard Worker   if (UNLIKELY(self->GetMethodTraceBuffer() != nullptr)) {
1566*795d594fSAndroid Build Coastguard Worker     Trace::ReleaseThreadBuffer(self);
1567*795d594fSAndroid Build Coastguard Worker   }
1568*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(self->GetMethodTraceBuffer(), nullptr) << Trace::GetDebugInformation();
1569*795d594fSAndroid Build Coastguard Worker   delete self;
1570*795d594fSAndroid Build Coastguard Worker 
1571*795d594fSAndroid Build Coastguard Worker   // Release the thread ID after the thread is finished and deleted to avoid cases where we can
1572*795d594fSAndroid Build Coastguard Worker   // temporarily have multiple threads with the same thread id. When this occurs, it causes
1573*795d594fSAndroid Build Coastguard Worker   // problems in FindThreadByThreadId / SuspendThreadByThreadId.
1574*795d594fSAndroid Build Coastguard Worker   ReleaseThreadId(nullptr, thin_lock_id);
1575*795d594fSAndroid Build Coastguard Worker 
1576*795d594fSAndroid Build Coastguard Worker   // Clear the TLS data, so that the underlying native thread is recognizably detached.
1577*795d594fSAndroid Build Coastguard Worker   // (It may wish to reattach later.)
1578*795d594fSAndroid Build Coastguard Worker #ifdef __BIONIC__
1579*795d594fSAndroid Build Coastguard Worker   __get_tls()[TLS_SLOT_ART_THREAD_SELF] = nullptr;
1580*795d594fSAndroid Build Coastguard Worker #else
1581*795d594fSAndroid Build Coastguard Worker   CHECK_PTHREAD_CALL(pthread_setspecific, (Thread::pthread_key_self_, nullptr), "detach self");
1582*795d594fSAndroid Build Coastguard Worker   Thread::self_tls_ = nullptr;
1583*795d594fSAndroid Build Coastguard Worker #endif
1584*795d594fSAndroid Build Coastguard Worker 
1585*795d594fSAndroid Build Coastguard Worker   // Signal that a thread just detached.
1586*795d594fSAndroid Build Coastguard Worker   MutexLock mu(nullptr, *Locks::thread_list_lock_);
1587*795d594fSAndroid Build Coastguard Worker   --unregistering_count_;
1588*795d594fSAndroid Build Coastguard Worker   Locks::thread_exit_cond_->Broadcast(nullptr);
1589*795d594fSAndroid Build Coastguard Worker }
1590*795d594fSAndroid Build Coastguard Worker 
ForEach(void (* callback)(Thread *,void *),void * context)1591*795d594fSAndroid Build Coastguard Worker void ThreadList::ForEach(void (*callback)(Thread*, void*), void* context) {
1592*795d594fSAndroid Build Coastguard Worker   for (const auto& thread : list_) {
1593*795d594fSAndroid Build Coastguard Worker     callback(thread, context);
1594*795d594fSAndroid Build Coastguard Worker   }
1595*795d594fSAndroid Build Coastguard Worker }
1596*795d594fSAndroid Build Coastguard Worker 
WaitForUnregisterToComplete(Thread * self)1597*795d594fSAndroid Build Coastguard Worker void ThreadList::WaitForUnregisterToComplete(Thread* self) {
1598*795d594fSAndroid Build Coastguard Worker   // We hold thread_list_lock_ .
1599*795d594fSAndroid Build Coastguard Worker   while (unregistering_count_ != 0) {
1600*795d594fSAndroid Build Coastguard Worker     LOG(WARNING) << "Waiting for a thread to finish unregistering";
1601*795d594fSAndroid Build Coastguard Worker     Locks::thread_exit_cond_->Wait(self);
1602*795d594fSAndroid Build Coastguard Worker   }
1603*795d594fSAndroid Build Coastguard Worker }
1604*795d594fSAndroid Build Coastguard Worker 
VisitRootsForSuspendedThreads(RootVisitor * visitor)1605*795d594fSAndroid Build Coastguard Worker void ThreadList::VisitRootsForSuspendedThreads(RootVisitor* visitor) {
1606*795d594fSAndroid Build Coastguard Worker   Thread* const self = Thread::Current();
1607*795d594fSAndroid Build Coastguard Worker   std::vector<Thread*> threads_to_visit;
1608*795d594fSAndroid Build Coastguard Worker 
1609*795d594fSAndroid Build Coastguard Worker   // Tell threads to suspend and copy them into list.
1610*795d594fSAndroid Build Coastguard Worker   {
1611*795d594fSAndroid Build Coastguard Worker     MutexLock mu(self, *Locks::thread_list_lock_);
1612*795d594fSAndroid Build Coastguard Worker     MutexLock mu2(self, *Locks::thread_suspend_count_lock_);
1613*795d594fSAndroid Build Coastguard Worker     for (Thread* thread : list_) {
1614*795d594fSAndroid Build Coastguard Worker       thread->IncrementSuspendCount(self);
1615*795d594fSAndroid Build Coastguard Worker       if (thread == self || thread->IsSuspended()) {
1616*795d594fSAndroid Build Coastguard Worker         threads_to_visit.push_back(thread);
1617*795d594fSAndroid Build Coastguard Worker       } else {
1618*795d594fSAndroid Build Coastguard Worker         thread->DecrementSuspendCount(self);
1619*795d594fSAndroid Build Coastguard Worker       }
1620*795d594fSAndroid Build Coastguard Worker     }
1621*795d594fSAndroid Build Coastguard Worker   }
1622*795d594fSAndroid Build Coastguard Worker 
1623*795d594fSAndroid Build Coastguard Worker   // Visit roots without holding thread_list_lock_ and thread_suspend_count_lock_ to prevent lock
1624*795d594fSAndroid Build Coastguard Worker   // order violations.
1625*795d594fSAndroid Build Coastguard Worker   for (Thread* thread : threads_to_visit) {
1626*795d594fSAndroid Build Coastguard Worker     thread->VisitRoots(visitor, kVisitRootFlagAllRoots);
1627*795d594fSAndroid Build Coastguard Worker   }
1628*795d594fSAndroid Build Coastguard Worker 
1629*795d594fSAndroid Build Coastguard Worker   // Restore suspend counts.
1630*795d594fSAndroid Build Coastguard Worker   {
1631*795d594fSAndroid Build Coastguard Worker     MutexLock mu2(self, *Locks::thread_suspend_count_lock_);
1632*795d594fSAndroid Build Coastguard Worker     for (Thread* thread : threads_to_visit) {
1633*795d594fSAndroid Build Coastguard Worker       thread->DecrementSuspendCount(self);
1634*795d594fSAndroid Build Coastguard Worker     }
1635*795d594fSAndroid Build Coastguard Worker     Thread::resume_cond_->Broadcast(self);
1636*795d594fSAndroid Build Coastguard Worker   }
1637*795d594fSAndroid Build Coastguard Worker }
1638*795d594fSAndroid Build Coastguard Worker 
VisitRoots(RootVisitor * visitor,VisitRootFlags flags) const1639*795d594fSAndroid Build Coastguard Worker void ThreadList::VisitRoots(RootVisitor* visitor, VisitRootFlags flags) const {
1640*795d594fSAndroid Build Coastguard Worker   MutexLock mu(Thread::Current(), *Locks::thread_list_lock_);
1641*795d594fSAndroid Build Coastguard Worker   for (const auto& thread : list_) {
1642*795d594fSAndroid Build Coastguard Worker     thread->VisitRoots(visitor, flags);
1643*795d594fSAndroid Build Coastguard Worker   }
1644*795d594fSAndroid Build Coastguard Worker }
1645*795d594fSAndroid Build Coastguard Worker 
VisitReflectiveTargets(ReflectiveValueVisitor * visitor) const1646*795d594fSAndroid Build Coastguard Worker void ThreadList::VisitReflectiveTargets(ReflectiveValueVisitor *visitor) const {
1647*795d594fSAndroid Build Coastguard Worker   MutexLock mu(Thread::Current(), *Locks::thread_list_lock_);
1648*795d594fSAndroid Build Coastguard Worker   for (const auto& thread : list_) {
1649*795d594fSAndroid Build Coastguard Worker     thread->VisitReflectiveTargets(visitor);
1650*795d594fSAndroid Build Coastguard Worker   }
1651*795d594fSAndroid Build Coastguard Worker }
1652*795d594fSAndroid Build Coastguard Worker 
SweepInterpreterCaches(IsMarkedVisitor * visitor) const1653*795d594fSAndroid Build Coastguard Worker void ThreadList::SweepInterpreterCaches(IsMarkedVisitor* visitor) const {
1654*795d594fSAndroid Build Coastguard Worker   MutexLock mu(Thread::Current(), *Locks::thread_list_lock_);
1655*795d594fSAndroid Build Coastguard Worker   for (const auto& thread : list_) {
1656*795d594fSAndroid Build Coastguard Worker     thread->SweepInterpreterCache(visitor);
1657*795d594fSAndroid Build Coastguard Worker   }
1658*795d594fSAndroid Build Coastguard Worker }
1659*795d594fSAndroid Build Coastguard Worker 
AllocThreadId(Thread * self)1660*795d594fSAndroid Build Coastguard Worker uint32_t ThreadList::AllocThreadId(Thread* self) {
1661*795d594fSAndroid Build Coastguard Worker   MutexLock mu(self, *Locks::allocated_thread_ids_lock_);
1662*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < allocated_ids_.size(); ++i) {
1663*795d594fSAndroid Build Coastguard Worker     if (!allocated_ids_[i]) {
1664*795d594fSAndroid Build Coastguard Worker       allocated_ids_.set(i);
1665*795d594fSAndroid Build Coastguard Worker       return i + 1;  // Zero is reserved to mean "invalid".
1666*795d594fSAndroid Build Coastguard Worker     }
1667*795d594fSAndroid Build Coastguard Worker   }
1668*795d594fSAndroid Build Coastguard Worker   LOG(FATAL) << "Out of internal thread ids";
1669*795d594fSAndroid Build Coastguard Worker   UNREACHABLE();
1670*795d594fSAndroid Build Coastguard Worker }
1671*795d594fSAndroid Build Coastguard Worker 
ReleaseThreadId(Thread * self,uint32_t id)1672*795d594fSAndroid Build Coastguard Worker void ThreadList::ReleaseThreadId(Thread* self, uint32_t id) {
1673*795d594fSAndroid Build Coastguard Worker   MutexLock mu(self, *Locks::allocated_thread_ids_lock_);
1674*795d594fSAndroid Build Coastguard Worker   --id;  // Zero is reserved to mean "invalid".
1675*795d594fSAndroid Build Coastguard Worker   DCHECK(allocated_ids_[id]) << id;
1676*795d594fSAndroid Build Coastguard Worker   allocated_ids_.reset(id);
1677*795d594fSAndroid Build Coastguard Worker }
1678*795d594fSAndroid Build Coastguard Worker 
ScopedSuspendAll(const char * cause,bool long_suspend)1679*795d594fSAndroid Build Coastguard Worker ScopedSuspendAll::ScopedSuspendAll(const char* cause, bool long_suspend) {
1680*795d594fSAndroid Build Coastguard Worker   Runtime::Current()->GetThreadList()->SuspendAll(cause, long_suspend);
1681*795d594fSAndroid Build Coastguard Worker }
1682*795d594fSAndroid Build Coastguard Worker 
~ScopedSuspendAll()1683*795d594fSAndroid Build Coastguard Worker ScopedSuspendAll::~ScopedSuspendAll() {
1684*795d594fSAndroid Build Coastguard Worker   Runtime::Current()->GetThreadList()->ResumeAll();
1685*795d594fSAndroid Build Coastguard Worker }
1686*795d594fSAndroid Build Coastguard Worker 
1687*795d594fSAndroid Build Coastguard Worker }  // namespace art
1688