diff options
Diffstat (limited to 'runtime/thread.h')
-rw-r--r-- | runtime/thread.h | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/runtime/thread.h b/runtime/thread.h index d248123db5..016c2bc7ea 100644 --- a/runtime/thread.h +++ b/runtime/thread.h @@ -1363,12 +1363,12 @@ class Thread { instrumentation_stack(nullptr), debug_invoke_req(nullptr), single_step_control(nullptr), stacked_shadow_frame_record(nullptr), deoptimization_context_stack(nullptr), frame_id_to_shadow_frame(nullptr), name(nullptr), pthread_self(0), - last_no_thread_suspension_cause(nullptr), thread_local_start(nullptr), - thread_local_objects(0), thread_local_pos(nullptr), thread_local_end(nullptr), - mterp_current_ibase(nullptr), mterp_default_ibase(nullptr), mterp_alt_ibase(nullptr), - thread_local_alloc_stack_top(nullptr), thread_local_alloc_stack_end(nullptr), - nested_signal_state(nullptr), flip_function(nullptr), method_verifier(nullptr), - thread_local_mark_stack(nullptr) { + last_no_thread_suspension_cause(nullptr), checkpoint_function(nullptr), + thread_local_start(nullptr), thread_local_pos(nullptr), thread_local_end(nullptr), + thread_local_objects(0), mterp_current_ibase(nullptr), mterp_default_ibase(nullptr), + mterp_alt_ibase(nullptr), thread_local_alloc_stack_top(nullptr), + thread_local_alloc_stack_end(nullptr), nested_signal_state(nullptr), + flip_function(nullptr), method_verifier(nullptr), thread_local_mark_stack(nullptr) { std::fill(held_mutexes, held_mutexes + kLockLevelCount, nullptr); } @@ -1480,11 +1480,11 @@ class Thread { // Thread-local allocation pointer. uint8_t* thread_local_start; - size_t thread_local_objects; // thread_local_pos and thread_local_end must be consecutive for ldrd and are 8 byte aligned for // potentially better performance. uint8_t* thread_local_pos; uint8_t* thread_local_end; + size_t thread_local_objects; // Mterp jump table bases. void* mterp_current_ibase; @@ -1546,19 +1546,25 @@ class Thread { class SCOPED_CAPABILITY ScopedAssertNoThreadSuspension { public: - ScopedAssertNoThreadSuspension(Thread* self, const char* cause) ACQUIRE(Roles::uninterruptible_) - : self_(self), old_cause_(self->StartAssertNoThreadSuspension(cause)) { - } - ~ScopedAssertNoThreadSuspension() RELEASE(Roles::uninterruptible_) { - self_->EndAssertNoThreadSuspension(old_cause_); + ALWAYS_INLINE ScopedAssertNoThreadSuspension(const char* cause) ACQUIRE(Roles::uninterruptible_) { + if (kIsDebugBuild) { + self_ = Thread::Current(); + old_cause_ = self_->StartAssertNoThreadSuspension(cause); + } else { + Roles::uninterruptible_.Acquire(); // No-op. + } } - Thread* Self() { - return self_; + ALWAYS_INLINE ~ScopedAssertNoThreadSuspension() RELEASE(Roles::uninterruptible_) { + if (kIsDebugBuild) { + self_->EndAssertNoThreadSuspension(old_cause_); + } else { + Roles::uninterruptible_.Release(); // No-op. + } } private: - Thread* const self_; - const char* const old_cause_; + Thread* self_; + const char* old_cause_; }; class ScopedStackedShadowFramePusher { |