summaryrefslogtreecommitdiff
path: root/runtime/thread.h
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/thread.h')
-rw-r--r--runtime/thread.h15
1 files changed, 14 insertions, 1 deletions
diff --git a/runtime/thread.h b/runtime/thread.h
index b01ec945de..30c7e8ff86 100644
--- a/runtime/thread.h
+++ b/runtime/thread.h
@@ -133,9 +133,19 @@ class PACKED(4) Thread {
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
ThreadState GetState() const {
+ DCHECK(state_and_flags_.as_struct.state >= kTerminated && state_and_flags_.as_struct.state <= kSuspended);
return static_cast<ThreadState>(state_and_flags_.as_struct.state);
}
+ // This function can be used to make sure a thread's state is valid.
+ void CheckState(int id) const {
+ if (state_and_flags_.as_struct.state >= kTerminated && state_and_flags_.as_struct.state <= kSuspended) {
+ return;
+ }
+ LOG(INFO) << "Thread " << this << " state is invalid: " << state_and_flags_.as_struct.state << " id=" << id;
+ CHECK(false);
+ }
+
ThreadState SetState(ThreadState new_state);
int GetSuspendCount() const EXCLUSIVE_LOCKS_REQUIRED(Locks::thread_suspend_count_lock_) {
@@ -780,9 +790,12 @@ class PACKED(4) Thread {
// Cause for last suspension.
const char* last_no_thread_suspension_cause_;
+ // Maximum number of checkpoint functions.
+ static constexpr uint32_t kMaxCheckpoints = 3;
+
// Pending checkpoint function or NULL if non-pending. Installation guarding by
// Locks::thread_suspend_count_lock_.
- Closure* checkpoint_function_;
+ Closure* checkpoint_functions_[kMaxCheckpoints];
public:
// Entrypoint function pointers