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(NoOOBMessageScope) { |
| 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 uword stack_limit; |
| 176 uword interrupt_bits; |
| 177 |
| 178 // Initially no interrupts are scheduled or deferred. |
| 179 Isolate* isolate = Thread::Current()->isolate(); |
| 180 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate), |
| 181 IsolateTestHelper::GetSavedStackLimit(isolate)); |
| 182 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterruptsMask(isolate)); |
| 183 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterrupts(isolate)); |
| 184 |
| 185 { |
| 186 // Defer message interrupts. |
| 187 NoOOBMessageScope no_msg_scope(Thread::Current()); |
| 188 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate), |
| 189 IsolateTestHelper::GetSavedStackLimit(isolate)); |
| 190 EXPECT_EQ(kMessageInterrupt, |
| 191 IsolateTestHelper::GetDeferredInterruptsMask(isolate)); |
| 192 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterrupts(isolate)); |
| 193 |
| 194 // Schedule a message, it is deferred. |
| 195 isolate->ScheduleInterrupts(Isolate::kMessageInterrupt); |
| 196 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate), |
| 197 IsolateTestHelper::GetSavedStackLimit(isolate)); |
| 198 EXPECT_EQ(kMessageInterrupt, |
| 199 IsolateTestHelper::GetDeferredInterruptsMask(isolate)); |
| 200 EXPECT_EQ(kMessageInterrupt, |
| 201 IsolateTestHelper::GetDeferredInterrupts(isolate)); |
| 202 |
| 203 // Schedule a vm interrupt, it is not deferred. |
| 204 isolate->ScheduleInterrupts(Isolate::kVMInterrupt); |
| 205 stack_limit = IsolateTestHelper::GetStackLimit(isolate); |
| 206 EXPECT_NE(stack_limit, IsolateTestHelper::GetSavedStackLimit(isolate)); |
| 207 EXPECT((stack_limit & Isolate::kVMInterrupt) != 0); |
| 208 EXPECT_EQ(kMessageInterrupt, |
| 209 IsolateTestHelper::GetDeferredInterruptsMask(isolate)); |
| 210 EXPECT_EQ(kMessageInterrupt, |
| 211 IsolateTestHelper::GetDeferredInterrupts(isolate)); |
| 212 |
| 213 // Clear the vm interrupt. Message is still deferred. |
| 214 interrupt_bits = isolate->GetAndClearInterrupts(); |
| 215 EXPECT_EQ(kVMInterrupt, interrupt_bits); |
| 216 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate), |
| 217 IsolateTestHelper::GetSavedStackLimit(isolate)); |
| 218 EXPECT_EQ(kMessageInterrupt, |
| 219 IsolateTestHelper::GetDeferredInterruptsMask(isolate)); |
| 220 EXPECT_EQ(kMessageInterrupt, |
| 221 IsolateTestHelper::GetDeferredInterrupts(isolate)); |
| 222 } |
| 223 |
| 224 // Restore message interrupts. Message is now pending. |
| 225 stack_limit = IsolateTestHelper::GetStackLimit(isolate); |
| 226 EXPECT_NE(stack_limit, IsolateTestHelper::GetSavedStackLimit(isolate)); |
| 227 EXPECT((stack_limit & Isolate::kMessageInterrupt) != 0); |
| 228 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterruptsMask(isolate)); |
| 229 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterrupts(isolate)); |
| 230 |
| 231 { |
| 232 // Defer message interrupts, again. The pending interrupt is deferred. |
| 233 NoOOBMessageScope no_msg_scope(Thread::Current()); |
| 234 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate), |
| 235 IsolateTestHelper::GetSavedStackLimit(isolate)); |
| 236 EXPECT_EQ(kMessageInterrupt, |
| 237 IsolateTestHelper::GetDeferredInterruptsMask(isolate)); |
| 238 EXPECT_EQ(kMessageInterrupt, |
| 239 IsolateTestHelper::GetDeferredInterrupts(isolate)); |
| 240 } |
| 241 |
| 242 // Restore, then clear interrupts. The world is as it was. |
| 243 interrupt_bits = isolate->GetAndClearInterrupts(); |
| 244 EXPECT_EQ(kMessageInterrupt, interrupt_bits); |
| 245 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate), |
| 246 IsolateTestHelper::GetSavedStackLimit(isolate)); |
| 247 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterruptsMask(isolate)); |
| 248 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterrupts(isolate)); |
| 249 } |
| 250 |
152 } // namespace dart | 251 } // namespace dart |
OLD | NEW |