Index: runtime/vm/message_handler.cc |
diff --git a/runtime/vm/message_handler.cc b/runtime/vm/message_handler.cc |
index 30194cd5b4ec4a3074f690712f8bca1c2679a0b3..de5fae8b758821218cdbe4f84ee94b5c9abde1f2 100644 |
--- a/runtime/vm/message_handler.cc |
+++ b/runtime/vm/message_handler.cc |
@@ -258,6 +258,18 @@ MessageHandler::MessageStatus MessageHandler::HandleNextMessage() { |
} |
+MessageHandler::MessageStatus MessageHandler::HandleNormalMessages() { |
+ // We can only call HandleNormalMessages when this handler is not |
+ // assigned to a thread pool. |
+ MonitorLocker ml(&monitor_); |
+ ASSERT(pool_ == NULL); |
+#if defined(DEBUG) |
+ CheckAccess(); |
+#endif |
+ return HandleMessages(true, true); |
+} |
+ |
+ |
MessageHandler::MessageStatus MessageHandler::HandleOOBMessages() { |
if (!oob_message_handling_allowed_) { |
return kOK; |
@@ -300,8 +312,7 @@ void MessageHandler::TaskCallback() { |
// NotifyPauseOnStart. This avoids a dead lock that can occur |
// when this message handler tries to post a message while a |
// message is being posted to it. |
- paused_on_start_ = true; |
- paused_timestamp_ = OS::GetCurrentTimeMillis(); |
+ PausedOnStartLocked(true); |
monitor_.Exit(); |
NotifyPauseOnStart(); |
monitor_.Enter(); |
@@ -314,8 +325,12 @@ void MessageHandler::TaskCallback() { |
task_ = NULL; // No task in queue. |
return; |
} else { |
- paused_on_start_ = false; |
- paused_timestamp_ = -1; |
+ // Resumed. Clear the resume request of the owning isolate. |
+ Isolate* owning_isolate = isolate(); |
+ if (owning_isolate != NULL) { |
+ owning_isolate->GetAndClearResumeRequest(); |
+ } |
turnidge
2016/02/03 21:33:37
I'm guessing it doesn't work to move this into Set
|
+ PausedOnStartLocked(false); |
} |
} |
@@ -352,8 +367,7 @@ void MessageHandler::TaskCallback() { |
// NotifyPauseOnExit. This avoids a dead lock that can |
// occur when this message handler tries to post a message |
// while a message is being posted to it. |
- paused_on_exit_ = true; |
- paused_timestamp_ = OS::GetCurrentTimeMillis(); |
+ PausedOnExitLocked(true); |
monitor_.Exit(); |
NotifyPauseOnExit(); |
monitor_.Enter(); |
@@ -367,8 +381,12 @@ void MessageHandler::TaskCallback() { |
task_ = NULL; // No task in queue. |
return; |
} else { |
- paused_on_exit_ = false; |
- paused_timestamp_ = -1; |
+ // Resumed. Clear the resume request of the owning isolate. |
+ Isolate* owning_isolate = isolate(); |
+ if (owning_isolate != NULL) { |
+ owning_isolate->GetAndClearResumeRequest(); |
+ } |
+ PausedOnExitLocked(false); |
} |
} |
if (FLAG_trace_isolates) { |
@@ -443,6 +461,40 @@ void MessageHandler::decrement_live_ports() { |
} |
+void MessageHandler::PausedOnStart(bool v) { |
+ MonitorLocker ml(&monitor_); |
+ PausedOnStartLocked(v); |
+} |
+ |
+ |
+void MessageHandler::PausedOnStartLocked(bool v) { |
+ if (v) { |
+ paused_on_start_ = true; |
+ paused_timestamp_ = OS::GetCurrentTimeMillis(); |
+ } else { |
+ paused_on_start_ = false; |
+ paused_timestamp_ = -1; |
+ } |
+} |
+ |
+ |
+void MessageHandler::PausedOnExit(bool v) { |
+ MonitorLocker ml(&monitor_); |
+ PausedOnExitLocked(v); |
+} |
+ |
+ |
+void MessageHandler::PausedOnExitLocked(bool v) { |
+ if (v) { |
+ paused_on_exit_ = true; |
+ paused_timestamp_ = OS::GetCurrentTimeMillis(); |
+ } else { |
+ paused_on_exit_ = false; |
+ paused_timestamp_ = -1; |
+ } |
+} |
+ |
+ |
MessageHandler::AcquiredQueues::AcquiredQueues() |
: handler_(NULL) { |
} |