diff --git a/src/inspector/main_thread_interface.cc b/src/inspector/main_thread_interface.cc index 0fca7483e95c65..bcdf890d143d80 100644 --- a/src/inspector/main_thread_interface.cc +++ b/src/inspector/main_thread_interface.cc @@ -240,26 +240,32 @@ void MainThreadInterface::StopWaitingForFrontendEvent() { } void MainThreadInterface::DispatchMessages() { - if (dispatching_messages_) - return; - dispatching_messages_ = true; - bool had_messages = false; - do { - if (dispatching_message_queue_.empty()) { - Mutex::ScopedLock scoped_lock(requests_lock_); - requests_.swap(dispatching_message_queue_); - } - had_messages = !dispatching_message_queue_.empty(); - while (!dispatching_message_queue_.empty()) { - MessageQueue::value_type task; - std::swap(dispatching_message_queue_.front(), task); - dispatching_message_queue_.pop_front(); - - v8::SealHandleScope seal_handle_scope(agent_->env()->isolate()); - task->Call(this); - } - } while (had_messages); - dispatching_messages_ = false; + bool expected = false; + // compare_exchange_strong returns true if the value was successfully changed + // from false to true. + if (dispatching_messages_.compare_exchange_strong( + expected, + true, + std::memory_order_acquire, + std::memory_order_relaxed)) { + bool had_messages = false; + do { + if (dispatching_message_queue_.empty()) { + Mutex::ScopedLock scoped_lock(requests_lock_); + requests_.swap(dispatching_message_queue_); + } + had_messages = !dispatching_message_queue_.empty(); + while (!dispatching_message_queue_.empty()) { + MessageQueue::value_type task; + std::swap(dispatching_message_queue_.front(), task); + dispatching_message_queue_.pop_front(); + + v8::SealHandleScope seal_handle_scope(agent_->env()->isolate()); + task->Call(this); + } + } while (had_messages); + dispatching_messages_.store(false, std::memory_order_release); + } } std::shared_ptr MainThreadInterface::GetHandle() { diff --git a/src/inspector/main_thread_interface.h b/src/inspector/main_thread_interface.h index 35997adbe5ac66..2b7adeaa6b0b1a 100644 --- a/src/inspector/main_thread_interface.h +++ b/src/inspector/main_thread_interface.h @@ -94,7 +94,7 @@ class MainThreadInterface : // This queue is to maintain the order of the messages for the cases // when we reenter the DispatchMessages function. MessageQueue dispatching_message_queue_; - bool dispatching_messages_ = false; + std::atomic dispatching_messages_ = false; // This flag indicates an internal request to exit the loop in // WaitForFrontendEvent(). It's set to true by calling // StopWaitingForFrontendEvent().