OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "include/dart_api.h" | 5 #include "include/dart_api.h" |
6 #include "platform/assert.h" | 6 #include "platform/assert.h" |
7 #include "vm/globals.h" | 7 #include "vm/globals.h" |
8 #include "vm/isolate.h" | 8 #include "vm/isolate.h" |
9 #include "vm/lockers.h" | 9 #include "vm/lockers.h" |
10 #include "vm/thread_barrier.h" | 10 #include "vm/thread_barrier.h" |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 isolate->ScheduleInterrupts(Isolate::kVMInterrupt); | 142 isolate->ScheduleInterrupts(Isolate::kVMInterrupt); |
143 // Wait for all tasks to observe the interrupt. | 143 // Wait for all tasks to observe the interrupt. |
144 barrier.Sync(); | 144 barrier.Sync(); |
145 // Continue with next round. | 145 // Continue with next round. |
146 uword interrupts = isolate->GetAndClearInterrupts(); | 146 uword interrupts = isolate->GetAndClearInterrupts(); |
147 EXPECT((interrupts & Isolate::kVMInterrupt) != 0); | 147 EXPECT((interrupts & Isolate::kVMInterrupt) != 0); |
148 } | 148 } |
149 barrier.Exit(); | 149 barrier.Exit(); |
150 } | 150 } |
151 | 151 |
| 152 |
| 153 class IsolateTestHelper { |
| 154 public: |
| 155 static uword GetStackLimit(Isolate* isolate) { |
| 156 return isolate->stack_limit_; |
| 157 } |
| 158 static uword GetSavedStackLimit(Isolate* isolate) { |
| 159 return isolate->saved_stack_limit_; |
| 160 } |
| 161 static uword GetDeferredInterruptsMask(Isolate* isolate) { |
| 162 return isolate->deferred_interrupts_mask_; |
| 163 } |
| 164 static uword GetDeferredInterrupts(Isolate* isolate) { |
| 165 return isolate->deferred_interrupts_; |
| 166 } |
| 167 }; |
| 168 |
| 169 |
| 170 TEST_CASE(DeferMessageInterrupts) { |
| 171 // EXPECT_EQ is picky about type agreement for its arguments. |
| 172 const uword kZero = 0; |
| 173 const uword kMessageInterrupt = Isolate::kMessageInterrupt; |
| 174 const uword kVMInterrupt = Isolate::kVMInterrupt; |
| 175 |
| 176 // Initially no interrupts are scheduled or deferred. |
| 177 Isolate* isolate = Thread::Current()->isolate(); |
| 178 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate), |
| 179 IsolateTestHelper::GetSavedStackLimit(isolate)); |
| 180 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterruptsMask(isolate)); |
| 181 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterrupts(isolate)); |
| 182 |
| 183 // Defer message interrupts. |
| 184 isolate->DeferMessageInterrupts(); |
| 185 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate), |
| 186 IsolateTestHelper::GetSavedStackLimit(isolate)); |
| 187 EXPECT_EQ(kMessageInterrupt, |
| 188 IsolateTestHelper::GetDeferredInterruptsMask(isolate)); |
| 189 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterrupts(isolate)); |
| 190 |
| 191 // Schedule a message, it is deferred. |
| 192 isolate->ScheduleInterrupts(Isolate::kMessageInterrupt); |
| 193 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate), |
| 194 IsolateTestHelper::GetSavedStackLimit(isolate)); |
| 195 EXPECT_EQ(kMessageInterrupt, |
| 196 IsolateTestHelper::GetDeferredInterruptsMask(isolate)); |
| 197 EXPECT_EQ(kMessageInterrupt, |
| 198 IsolateTestHelper::GetDeferredInterrupts(isolate)); |
| 199 |
| 200 // Schedule a vm interrupt, it is not deferred. |
| 201 isolate->ScheduleInterrupts(Isolate::kVMInterrupt); |
| 202 uword stack_limit = IsolateTestHelper::GetStackLimit(isolate); |
| 203 EXPECT_NE(stack_limit, IsolateTestHelper::GetSavedStackLimit(isolate)); |
| 204 EXPECT((stack_limit & Isolate::kVMInterrupt) != 0); |
| 205 EXPECT_EQ(kMessageInterrupt, |
| 206 IsolateTestHelper::GetDeferredInterruptsMask(isolate)); |
| 207 EXPECT_EQ(kMessageInterrupt, |
| 208 IsolateTestHelper::GetDeferredInterrupts(isolate)); |
| 209 |
| 210 // Clear the vm interrupt. Message is still deferred. |
| 211 uword interrupt_bits = isolate->GetAndClearInterrupts(); |
| 212 EXPECT_EQ(kVMInterrupt, interrupt_bits); |
| 213 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate), |
| 214 IsolateTestHelper::GetSavedStackLimit(isolate)); |
| 215 EXPECT_EQ(kMessageInterrupt, |
| 216 IsolateTestHelper::GetDeferredInterruptsMask(isolate)); |
| 217 EXPECT_EQ(kMessageInterrupt, |
| 218 IsolateTestHelper::GetDeferredInterrupts(isolate)); |
| 219 |
| 220 // Restore message interrupts. Message is now pending. |
| 221 isolate->RestoreMessageInterrupts(); |
| 222 stack_limit = IsolateTestHelper::GetStackLimit(isolate); |
| 223 EXPECT_NE(stack_limit, IsolateTestHelper::GetSavedStackLimit(isolate)); |
| 224 EXPECT((stack_limit & Isolate::kMessageInterrupt) != 0); |
| 225 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterruptsMask(isolate)); |
| 226 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterrupts(isolate)); |
| 227 |
| 228 // Defer message interrupts, again. The pending interrupt is deferred. |
| 229 isolate->DeferMessageInterrupts(); |
| 230 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate), |
| 231 IsolateTestHelper::GetSavedStackLimit(isolate)); |
| 232 EXPECT_EQ(kMessageInterrupt, |
| 233 IsolateTestHelper::GetDeferredInterruptsMask(isolate)); |
| 234 EXPECT_EQ(kMessageInterrupt, |
| 235 IsolateTestHelper::GetDeferredInterrupts(isolate)); |
| 236 |
| 237 // Restore, then clear interrupts. The world is as it was. |
| 238 isolate->RestoreMessageInterrupts(); |
| 239 interrupt_bits = isolate->GetAndClearInterrupts(); |
| 240 EXPECT_EQ(kMessageInterrupt, interrupt_bits); |
| 241 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate), |
| 242 IsolateTestHelper::GetSavedStackLimit(isolate)); |
| 243 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterruptsMask(isolate)); |
| 244 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterrupts(isolate)); |
| 245 } |
| 246 |
152 } // namespace dart | 247 } // namespace dart |
OLD | NEW |