Index: runtime/vm/thread.cc |
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc |
index 3c7efeeebeb16259343d6bce5361bad10d36cd11..e76100dc246a9d9d0cad5ab3f8388c561290d193 100644 |
--- a/runtime/vm/thread.cc |
+++ b/runtime/vm/thread.cc |
@@ -83,6 +83,7 @@ Thread::Thread(Isolate* isolate) |
#endif |
reusable_handles_(), |
saved_stack_limit_(0), |
+ defer_oob_messages_count_(0), |
deferred_interrupts_mask_(0), |
deferred_interrupts_(0), |
stack_overflow_count_(0), |
@@ -417,6 +418,11 @@ uword Thread::GetAndClearInterrupts() { |
void Thread::DeferOOBMessageInterrupts() { |
MonitorLocker ml(thread_lock_); |
+ defer_oob_messages_count_++; |
+ if (defer_oob_messages_count_ > 1) { |
+ // OOB message interrupts are already deferred. |
+ return; |
+ } |
ASSERT(deferred_interrupts_mask_ == 0); |
deferred_interrupts_mask_ = kMessageInterrupt; |
@@ -441,6 +447,11 @@ void Thread::DeferOOBMessageInterrupts() { |
void Thread::RestoreOOBMessageInterrupts() { |
MonitorLocker ml(thread_lock_); |
+ defer_oob_messages_count_--; |
+ if (defer_oob_messages_count_ > 0) { |
+ return; |
+ } |
+ ASSERT(defer_oob_messages_count_ == 0); |
ASSERT(deferred_interrupts_mask_ == kMessageInterrupt); |
deferred_interrupts_mask_ = 0; |
if (deferred_interrupts_ != 0) { |