106 const Thread* current_thread)
const;
110 if (handlers_[level]->SafepointInProgress()) {
121 : isolate_group_(isolate_group), level_(level) {}
123 bool SafepointInProgress()
const {
124 ASSERT(threads_lock()->IsOwnedByCurrentThread());
125 ASSERT((operation_count_ > 0) == (owner_ !=
nullptr));
126 return ((operation_count_ > 0) && (owner_ !=
nullptr));
128 void SetSafepointInProgress(Thread*
T) {
129 ASSERT(threads_lock()->IsOwnedByCurrentThread());
130 ASSERT(owner_ ==
nullptr);
131 ASSERT(operation_count_ == 0);
132 operation_count_ = 1;
135 void ResetSafepointInProgress(Thread*
T) {
136 ASSERT(threads_lock()->IsOwnedByCurrentThread());
138 ASSERT(operation_count_ == 1);
139 ASSERT(num_threads_not_parked_ == 0);
140 operation_count_ = 0;
143 void NotifyWeAreParked(Thread*
T);
145 IsolateGroup* isolate_group()
const {
return isolate_group_; }
146 Monitor* threads_lock()
const {
147 return isolate_group_->thread_registry()->threads_lock();
151 friend class SafepointHandler;
154 void NotifyThreadsToGetToSafepointLevel(
156 MallocGrowableArray<Dart_Port>* oob_isolates);
157 void WaitUntilThreadsReachedSafepointLevel();
160 void NotifyThreadsToContinue(Thread*
T);
167 Monitor parked_lock_;
172 std::atomic<Thread*> owner_ =
nullptr;
175 std::atomic<int32_t> operation_count_ = 0;
179 int32_t num_threads_not_parked_ = 0;
187 void AssertWeDoNotOwnLowerLevelSafepoints(Thread*
T,
SafepointLevel level);
193 void EnterSafepointLocked(Thread*
T, MonitorLocker* tl,
SafepointLevel level);
194 void ExitSafepointLocked(Thread*
T, MonitorLocker* tl,
SafepointLevel level);
196 IsolateGroup* isolate_group()
const {
return isolate_group_; }
197 Monitor* threads_lock()
const {