@@ -197,7 +197,7 @@ class AgentImpl {
197197 void SetConnected (bool connected);
198198 void DispatchMessages ();
199199 void Write (int session_id, const String16& message);
200- void AppendMessage (MessageQueue* vector, int session_id,
200+ bool AppendMessage (MessageQueue* vector, int session_id,
201201 const String16& message);
202202 void SwapBehindLock (MessageQueue* vector1, MessageQueue* vector2);
203203 void PostIncomingMessage (const String16& message);
@@ -666,10 +666,12 @@ void AgentImpl::WorkerRunIO() {
666666 CHECK_EQ (err, 0 );
667667}
668668
669- void AgentImpl::AppendMessage (MessageQueue* queue, int session_id,
669+ bool AgentImpl::AppendMessage (MessageQueue* queue, int session_id,
670670 const String16& message) {
671671 Mutex::ScopedLock scoped_lock (queue_lock_);
672+ bool trigger_pumping = queue->empty ();
672673 queue->push_back (std::make_pair (session_id, message));
674+ return trigger_pumping;
673675}
674676
675677void AgentImpl::SwapBehindLock (MessageQueue* vector1, MessageQueue* vector2) {
@@ -678,12 +680,13 @@ void AgentImpl::SwapBehindLock(MessageQueue* vector1, MessageQueue* vector2) {
678680}
679681
680682void AgentImpl::PostIncomingMessage (const String16& message) {
681- AppendMessage (&incoming_message_queue_, frontend_session_id_, message);
682- v8::Isolate* isolate = parent_env_->isolate ();
683- platform_->CallOnForegroundThread (isolate,
684- new DispatchOnInspectorBackendTask (this ));
685- isolate->RequestInterrupt (InterruptCallback, this );
686- uv_async_send (data_written_);
683+ if (AppendMessage (&incoming_message_queue_, frontend_session_id_, message)) {
684+ v8::Isolate* isolate = parent_env_->isolate ();
685+ platform_->CallOnForegroundThread (isolate,
686+ new DispatchOnInspectorBackendTask (this ));
687+ isolate->RequestInterrupt (InterruptCallback, this );
688+ uv_async_send (data_written_);
689+ }
687690}
688691
689692void AgentImpl::OnInspectorConnectionIO (inspector_socket_t * socket) {
@@ -698,33 +701,40 @@ void AgentImpl::OnInspectorConnectionIO(inspector_socket_t* socket) {
698701}
699702
700703void AgentImpl::DispatchMessages () {
704+ // This function can be reentered if there was an incoming message while
705+ // V8 was processing another inspector request (e.g. if the user is
706+ // evaluating a long-running JS code snippet). This can happen only at
707+ // specific points (e.g. the lines that call inspector_ methods)
701708 if (dispatching_messages_)
702709 return ;
703710 dispatching_messages_ = true ;
704711 MessageQueue tasks;
705- SwapBehindLock (&incoming_message_queue_, &tasks);
706- for (const MessageQueue::value_type& pair : tasks) {
707- const String16& message = pair.second ;
708- if (message == TAG_CONNECT) {
709- CHECK_EQ (State::kAccepting , state_);
710- backend_session_id_++;
711- state_ = State::kConnected ;
712- fprintf (stderr, " Debugger attached.\n " );
713- inspector_->connectFrontend ();
714- } else if (message == TAG_DISCONNECT) {
715- CHECK_EQ (State::kConnected , state_);
716- if (shutting_down_) {
717- state_ = State::kDone ;
712+ do {
713+ tasks.clear ();
714+ SwapBehindLock (&incoming_message_queue_, &tasks);
715+ for (const MessageQueue::value_type& pair : tasks) {
716+ const String16& message = pair.second ;
717+ if (message == TAG_CONNECT) {
718+ CHECK_EQ (State::kAccepting , state_);
719+ backend_session_id_++;
720+ state_ = State::kConnected ;
721+ fprintf (stderr, " Debugger attached.\n " );
722+ inspector_->connectFrontend ();
723+ } else if (message == TAG_DISCONNECT) {
724+ CHECK_EQ (State::kConnected , state_);
725+ if (shutting_down_) {
726+ state_ = State::kDone ;
727+ } else {
728+ PrintDebuggerReadyMessage (port_);
729+ state_ = State::kAccepting ;
730+ }
731+ inspector_->quitMessageLoopOnPause ();
732+ inspector_->disconnectFrontend ();
718733 } else {
719- PrintDebuggerReadyMessage (port_);
720- state_ = State::kAccepting ;
734+ inspector_->dispatchMessageFromFrontend (message);
721735 }
722- inspector_->quitMessageLoopOnPause ();
723- inspector_->disconnectFrontend ();
724- } else {
725- inspector_->dispatchMessageFromFrontend (message);
726736 }
727- }
737+ } while (!tasks. empty ());
728738 uv_async_send (data_written_);
729739 dispatching_messages_ = false ;
730740}
0 commit comments