• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ART_RUNTIME_MONITOR_H_
18 #define ART_RUNTIME_MONITOR_H_
19 
20 #include <pthread.h>
21 #include <stdint.h>
22 #include <stdlib.h>
23 
24 #include <iosfwd>
25 #include <list>
26 #include <vector>
27 
28 #include "base/allocator.h"
29 #include "base/atomic.h"
30 #include "base/mutex.h"
31 #include "gc_root.h"
32 #include "lock_word.h"
33 #include "obj_ptr.h"
34 #include "read_barrier_option.h"
35 #include "runtime_callbacks.h"
36 #include "thread_state.h"
37 
38 namespace art {
39 
40 class ArtMethod;
41 class IsMarkedVisitor;
42 class LockWord;
43 template<class T> class Handle;
44 class StackVisitor;
45 class Thread;
46 typedef uint32_t MonitorId;
47 
48 namespace mirror {
49 class Object;
50 }  // namespace mirror
51 
52 enum class LockReason {
53   kForWait,
54   kForLock,
55 };
56 
57 class Monitor {
58  public:
59   // The default number of spins that are done before thread suspension is used to forcibly inflate
60   // a lock word. See Runtime::max_spins_before_thin_lock_inflation_.
61   constexpr static size_t kDefaultMaxSpinsBeforeThinLockInflation = 50;
62 
63   ~Monitor();
64 
65   static void Init(uint32_t lock_profiling_threshold, uint32_t stack_dump_lock_profiling_threshold);
66 
67   // Return the thread id of the lock owner or 0 when there is no owner.
68   static uint32_t GetLockOwnerThreadId(ObjPtr<mirror::Object> obj)
69       NO_THREAD_SAFETY_ANALYSIS;  // TODO: Reading lock owner without holding lock is racy.
70 
71   // NO_THREAD_SAFETY_ANALYSIS for mon->Lock.
72   static ObjPtr<mirror::Object> MonitorEnter(Thread* thread,
73                                              ObjPtr<mirror::Object> obj,
74                                              bool trylock)
75       EXCLUSIVE_LOCK_FUNCTION(obj.Ptr())
76       NO_THREAD_SAFETY_ANALYSIS
77       REQUIRES(!Roles::uninterruptible_)
78       REQUIRES_SHARED(Locks::mutator_lock_);
79 
80   // NO_THREAD_SAFETY_ANALYSIS for mon->Unlock.
81   static bool MonitorExit(Thread* thread, ObjPtr<mirror::Object> obj)
82       NO_THREAD_SAFETY_ANALYSIS
83       REQUIRES(!Roles::uninterruptible_)
84       REQUIRES_SHARED(Locks::mutator_lock_)
85       UNLOCK_FUNCTION(obj.Ptr());
86 
Notify(Thread * self,ObjPtr<mirror::Object> obj)87   static void Notify(Thread* self, ObjPtr<mirror::Object> obj)
88       REQUIRES_SHARED(Locks::mutator_lock_) {
89     DoNotify(self, obj, false);
90   }
NotifyAll(Thread * self,ObjPtr<mirror::Object> obj)91   static void NotifyAll(Thread* self, ObjPtr<mirror::Object> obj)
92       REQUIRES_SHARED(Locks::mutator_lock_) {
93     DoNotify(self, obj, true);
94   }
95 
96   // Object.wait().  Also called for class init.
97   // NO_THREAD_SAFETY_ANALYSIS for mon->Wait.
98   static void Wait(Thread* self,
99                    ObjPtr<mirror::Object> obj,
100                    int64_t ms,
101                    int32_t ns,
102                    bool interruptShouldThrow, ThreadState why)
103       REQUIRES_SHARED(Locks::mutator_lock_) NO_THREAD_SAFETY_ANALYSIS;
104 
105   static ThreadState FetchState(const Thread* thread,
106                                 /* out */ ObjPtr<mirror::Object>* monitor_object,
107                                 /* out */ uint32_t* lock_owner_tid)
108       REQUIRES(!Locks::thread_suspend_count_lock_)
109       REQUIRES_SHARED(Locks::mutator_lock_);
110 
111   // Used to implement JDWP's ThreadReference.CurrentContendedMonitor.
112   static ObjPtr<mirror::Object> GetContendedMonitor(Thread* thread)
113       REQUIRES_SHARED(Locks::mutator_lock_);
114 
115   // Calls 'callback' once for each lock held in the single stack frame represented by
116   // the current state of 'stack_visitor'.
117   // The abort_on_failure flag allows to not die when the state of the runtime is unorderly. This
118   // is necessary when we have already aborted but want to dump the stack as much as we can.
119   static void VisitLocks(StackVisitor* stack_visitor,
120                          void (*callback)(ObjPtr<mirror::Object>, void*),
121                          void* callback_context,
122                          bool abort_on_failure = true)
123       REQUIRES_SHARED(Locks::mutator_lock_);
124 
125   static bool IsValidLockWord(LockWord lock_word);
126 
127   template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
128   ObjPtr<mirror::Object> GetObject() REQUIRES_SHARED(Locks::mutator_lock_);
129 
130   void SetObject(ObjPtr<mirror::Object> object);
131 
GetOwner()132   Thread* GetOwner() const NO_THREAD_SAFETY_ANALYSIS {
133     return owner_;
134   }
135 
136   int32_t GetHashCode();
137 
138   bool IsLocked() REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!monitor_lock_);
139 
HasHashCode()140   bool HasHashCode() const {
141     return hash_code_.load(std::memory_order_relaxed) != 0;
142   }
143 
GetMonitorId()144   MonitorId GetMonitorId() const {
145     return monitor_id_;
146   }
147 
148   // Inflate the lock on obj. May fail to inflate for spurious reasons, always re-check.
149   static void InflateThinLocked(Thread* self, Handle<mirror::Object> obj, LockWord lock_word,
150                                 uint32_t hash_code) REQUIRES_SHARED(Locks::mutator_lock_);
151 
152   // Not exclusive because ImageWriter calls this during a Heap::VisitObjects() that
153   // does not allow a thread suspension in the middle. TODO: maybe make this exclusive.
154   // NO_THREAD_SAFETY_ANALYSIS for monitor->monitor_lock_.
155   static bool Deflate(Thread* self, ObjPtr<mirror::Object> obj)
156       REQUIRES_SHARED(Locks::mutator_lock_) NO_THREAD_SAFETY_ANALYSIS;
157 
158 #ifndef __LP64__
new(size_t size)159   void* operator new(size_t size) {
160     // Align Monitor* as per the monitor ID field size in the lock word.
161     void* result;
162     int error = posix_memalign(&result, LockWord::kMonitorIdAlignment, size);
163     CHECK_EQ(error, 0) << strerror(error);
164     return result;
165   }
166 
delete(void * ptr)167   void operator delete(void* ptr) {
168     free(ptr);
169   }
170 #endif
171 
172  private:
173   Monitor(Thread* self, Thread* owner, ObjPtr<mirror::Object> obj, int32_t hash_code)
174       REQUIRES_SHARED(Locks::mutator_lock_);
175   Monitor(Thread* self, Thread* owner, ObjPtr<mirror::Object> obj, int32_t hash_code, MonitorId id)
176       REQUIRES_SHARED(Locks::mutator_lock_);
177 
178   // Install the monitor into its object, may fail if another thread installs a different monitor
179   // first.
180   bool Install(Thread* self)
181       REQUIRES(!monitor_lock_)
182       REQUIRES_SHARED(Locks::mutator_lock_);
183 
184   // Links a thread into a monitor's wait set.  The monitor lock must be held by the caller of this
185   // routine.
186   void AppendToWaitSet(Thread* thread) REQUIRES(monitor_lock_);
187 
188   // Unlinks a thread from a monitor's wait set.  The monitor lock must be held by the caller of
189   // this routine.
190   void RemoveFromWaitSet(Thread* thread) REQUIRES(monitor_lock_);
191 
192   void SignalContendersAndReleaseMonitorLock(Thread* self) RELEASE(monitor_lock_);
193 
194   // Changes the shape of a monitor from thin to fat, preserving the internal lock state. The
195   // calling thread must own the lock or the owner must be suspended. There's a race with other
196   // threads inflating the lock, installing hash codes and spurious failures. The caller should
197   // re-read the lock word following the call.
198   static void Inflate(Thread* self, Thread* owner, ObjPtr<mirror::Object> obj, int32_t hash_code)
199       REQUIRES_SHARED(Locks::mutator_lock_)
200       NO_THREAD_SAFETY_ANALYSIS;  // For m->Install(self)
201 
202   void LogContentionEvent(Thread* self,
203                           uint32_t wait_ms,
204                           uint32_t sample_percent,
205                           ArtMethod* owner_method,
206                           uint32_t owner_dex_pc)
207       REQUIRES_SHARED(Locks::mutator_lock_);
208 
209   static void FailedUnlock(ObjPtr<mirror::Object> obj,
210                            uint32_t expected_owner_thread_id,
211                            uint32_t found_owner_thread_id,
212                            Monitor* mon)
213       REQUIRES(!Locks::thread_list_lock_,
214                !monitor_lock_)
215       REQUIRES_SHARED(Locks::mutator_lock_);
216 
217   // Try to lock without blocking, returns true if we acquired the lock.
218   bool TryLock(Thread* self)
219       REQUIRES(!monitor_lock_)
220       REQUIRES_SHARED(Locks::mutator_lock_);
221   // Variant for already holding the monitor lock.
222   bool TryLockLocked(Thread* self)
223       REQUIRES(monitor_lock_)
224       REQUIRES_SHARED(Locks::mutator_lock_);
225 
226   template<LockReason reason = LockReason::kForLock>
227   void Lock(Thread* self)
228       REQUIRES(!monitor_lock_)
229       REQUIRES_SHARED(Locks::mutator_lock_);
230 
231   bool Unlock(Thread* thread)
232       REQUIRES(!monitor_lock_)
233       REQUIRES_SHARED(Locks::mutator_lock_);
234 
235   static void DoNotify(Thread* self, ObjPtr<mirror::Object> obj, bool notify_all)
236       REQUIRES_SHARED(Locks::mutator_lock_) NO_THREAD_SAFETY_ANALYSIS;  // For mon->Notify.
237 
238   void Notify(Thread* self)
239       REQUIRES(!monitor_lock_)
240       REQUIRES_SHARED(Locks::mutator_lock_);
241 
242   void NotifyAll(Thread* self)
243       REQUIRES(!monitor_lock_)
244       REQUIRES_SHARED(Locks::mutator_lock_);
245 
246   static std::string PrettyContentionInfo(const std::string& owner_name,
247                                           pid_t owner_tid,
248                                           ArtMethod* owners_method,
249                                           uint32_t owners_dex_pc,
250                                           size_t num_waiters)
251       REQUIRES_SHARED(Locks::mutator_lock_);
252 
253   // Wait on a monitor until timeout, interrupt, or notification.  Used for Object.wait() and
254   // (somewhat indirectly) Thread.sleep() and Thread.join().
255   //
256   // If another thread calls Thread.interrupt(), we throw InterruptedException and return
257   // immediately if one of the following are true:
258   //  - blocked in wait(), wait(long), or wait(long, int) methods of Object
259   //  - blocked in join(), join(long), or join(long, int) methods of Thread
260   //  - blocked in sleep(long), or sleep(long, int) methods of Thread
261   // Otherwise, we set the "interrupted" flag.
262   //
263   // Checks to make sure that "ns" is in the range 0-999999 (i.e. fractions of a millisecond) and
264   // throws the appropriate exception if it isn't.
265   //
266   // The spec allows "spurious wakeups", and recommends that all code using Object.wait() do so in
267   // a loop.  This appears to derive from concerns about pthread_cond_wait() on multiprocessor
268   // systems.  Some commentary on the web casts doubt on whether these can/should occur.
269   //
270   // Since we're allowed to wake up "early", we clamp extremely long durations to return at the end
271   // of the 32-bit time epoch.
272   void Wait(Thread* self, int64_t msec, int32_t nsec, bool interruptShouldThrow, ThreadState why)
273       REQUIRES(!monitor_lock_)
274       REQUIRES_SHARED(Locks::mutator_lock_);
275 
276   // Translates the provided method and pc into its declaring class' source file and line number.
277   static void TranslateLocation(ArtMethod* method, uint32_t pc,
278                                 const char** source_file,
279                                 int32_t* line_number)
280       REQUIRES_SHARED(Locks::mutator_lock_);
281 
282   uint32_t GetOwnerThreadId() REQUIRES(!monitor_lock_);
283 
284   // Support for systrace output of monitor operations.
285   ALWAYS_INLINE static void AtraceMonitorLock(Thread* self,
286                                               ObjPtr<mirror::Object> obj,
287                                               bool is_wait)
288       REQUIRES_SHARED(Locks::mutator_lock_);
289   static void AtraceMonitorLockImpl(Thread* self,
290                                     ObjPtr<mirror::Object> obj,
291                                     bool is_wait)
292       REQUIRES_SHARED(Locks::mutator_lock_);
293   ALWAYS_INLINE static void AtraceMonitorUnlock();
294 
295   static uint32_t lock_profiling_threshold_;
296   static uint32_t stack_dump_lock_profiling_threshold_;
297 
298   Mutex monitor_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
299 
300   ConditionVariable monitor_contenders_ GUARDED_BY(monitor_lock_);
301 
302   // Number of people waiting on the condition.
303   size_t num_waiters_ GUARDED_BY(monitor_lock_);
304 
305   // Which thread currently owns the lock?
306   Thread* volatile owner_ GUARDED_BY(monitor_lock_);
307 
308   // Owner's recursive lock depth.
309   int lock_count_ GUARDED_BY(monitor_lock_);
310 
311   // What object are we part of. This is a weak root. Do not access
312   // this directly, use GetObject() to read it so it will be guarded
313   // by a read barrier.
314   GcRoot<mirror::Object> obj_;
315 
316   // Threads currently waiting on this monitor.
317   Thread* wait_set_ GUARDED_BY(monitor_lock_);
318 
319   // Threads that were waiting on this monitor, but are now contending on it.
320   Thread* wake_set_ GUARDED_BY(monitor_lock_);
321 
322   // Stored object hash code, generated lazily by GetHashCode.
323   AtomicInteger hash_code_;
324 
325   // Method and dex pc where the lock owner acquired the lock, used when lock
326   // sampling is enabled. locking_method_ may be null if the lock is currently
327   // unlocked, or if the lock is acquired by the system when the stack is empty.
328   ArtMethod* locking_method_ GUARDED_BY(monitor_lock_);
329   uint32_t locking_dex_pc_ GUARDED_BY(monitor_lock_);
330 
331   // The denser encoded version of this monitor as stored in the lock word.
332   MonitorId monitor_id_;
333 
334 #ifdef __LP64__
335   // Free list for monitor pool.
336   Monitor* next_free_ GUARDED_BY(Locks::allocated_monitor_ids_lock_);
337 #endif
338 
339   friend class MonitorInfo;
340   friend class MonitorList;
341   friend class MonitorPool;
342   friend class mirror::Object;
343   DISALLOW_COPY_AND_ASSIGN(Monitor);
344 };
345 
346 class MonitorList {
347  public:
348   MonitorList();
349   ~MonitorList();
350 
351   void Add(Monitor* m) REQUIRES_SHARED(Locks::mutator_lock_) REQUIRES(!monitor_list_lock_);
352 
353   void SweepMonitorList(IsMarkedVisitor* visitor)
354       REQUIRES(!monitor_list_lock_) REQUIRES_SHARED(Locks::mutator_lock_);
355   void DisallowNewMonitors() REQUIRES(!monitor_list_lock_);
356   void AllowNewMonitors() REQUIRES(!monitor_list_lock_);
357   void BroadcastForNewMonitors() REQUIRES(!monitor_list_lock_);
358   // Returns how many monitors were deflated.
359   size_t DeflateMonitors() REQUIRES(!monitor_list_lock_) REQUIRES(Locks::mutator_lock_);
360   size_t Size() REQUIRES(!monitor_list_lock_);
361 
362   typedef std::list<Monitor*, TrackingAllocator<Monitor*, kAllocatorTagMonitorList>> Monitors;
363 
364  private:
365   // During sweeping we may free an object and on a separate thread have an object created using
366   // the newly freed memory. That object may then have its lock-word inflated and a monitor created.
367   // If we allow new monitor registration during sweeping this monitor may be incorrectly freed as
368   // the object wasn't marked when sweeping began.
369   bool allow_new_monitors_ GUARDED_BY(monitor_list_lock_);
370   Mutex monitor_list_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
371   ConditionVariable monitor_add_condition_ GUARDED_BY(monitor_list_lock_);
372   Monitors list_ GUARDED_BY(monitor_list_lock_);
373 
374   friend class Monitor;
375   DISALLOW_COPY_AND_ASSIGN(MonitorList);
376 };
377 
378 // Collects information about the current state of an object's monitor.
379 // This is very unsafe, and must only be called when all threads are suspended.
380 // For use only by the JDWP implementation.
381 class MonitorInfo {
382  public:
MonitorInfo()383   MonitorInfo() : owner_(nullptr), entry_count_(0) {}
384   MonitorInfo(const MonitorInfo&) = default;
385   MonitorInfo& operator=(const MonitorInfo&) = default;
386   explicit MonitorInfo(ObjPtr<mirror::Object> o) REQUIRES(Locks::mutator_lock_);
387 
388   Thread* owner_;
389   size_t entry_count_;
390   std::vector<Thread*> waiters_;
391 };
392 
393 }  // namespace art
394 
395 #endif  // ART_RUNTIME_MONITOR_H_
396