| OLD | NEW |
| 1 // Copyright 2007-2011 the V8 project authors. All rights reserved. | 1 // Copyright 2007-2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 threads[i]->Join(); | 197 threads[i]->Join(); |
| 198 } | 198 } |
| 199 for (int i = 0; i < threads.length(); i++) { | 199 for (int i = 0; i < threads.length(); i++) { |
| 200 delete threads[i]; | 200 delete threads[i]; |
| 201 } | 201 } |
| 202 } | 202 } |
| 203 | 203 |
| 204 | 204 |
| 205 // Run many threads all locking on the same isolate | 205 // Run many threads all locking on the same isolate |
| 206 TEST(IsolateLockingStress) { | 206 TEST(IsolateLockingStress) { |
| 207 #ifdef V8_TARGET_ARCH_MIPS |
| 208 const int kNThreads = 50; |
| 209 #else |
| 207 const int kNThreads = 100; | 210 const int kNThreads = 100; |
| 211 #endif |
| 208 i::List<JoinableThread*> threads(kNThreads); | 212 i::List<JoinableThread*> threads(kNThreads); |
| 209 v8::Isolate* isolate = v8::Isolate::New(); | 213 v8::Isolate* isolate = v8::Isolate::New(); |
| 210 for (int i = 0; i < kNThreads; i++) { | 214 for (int i = 0; i < kNThreads; i++) { |
| 211 threads.Add(new IsolateLockingThreadWithLocalContext(isolate)); | 215 threads.Add(new IsolateLockingThreadWithLocalContext(isolate)); |
| 212 } | 216 } |
| 213 StartJoinAndDeleteThreads(threads); | 217 StartJoinAndDeleteThreads(threads); |
| 214 isolate->Dispose(); | 218 isolate->Dispose(); |
| 215 } | 219 } |
| 216 | 220 |
| 217 class IsolateNonlockingThread : public JoinableThread { | 221 class IsolateNonlockingThread : public JoinableThread { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 230 CHECK_EQ(isolate, v8::internal::Isolate::Current()); | 234 CHECK_EQ(isolate, v8::internal::Isolate::Current()); |
| 231 CalcFibAndCheck(); | 235 CalcFibAndCheck(); |
| 232 } | 236 } |
| 233 isolate->Dispose(); | 237 isolate->Dispose(); |
| 234 } | 238 } |
| 235 private: | 239 private: |
| 236 }; | 240 }; |
| 237 | 241 |
| 238 // Run many threads each accessing its own isolate without locking | 242 // Run many threads each accessing its own isolate without locking |
| 239 TEST(MultithreadedParallelIsolates) { | 243 TEST(MultithreadedParallelIsolates) { |
| 240 #ifdef V8_TARGET_ARCH_ARM | 244 #if defined(V8_TARGET_ARCH_ARM) || defined(V8_TARGET_ARCH_MIPS) |
| 241 const int kNThreads = 10; | 245 const int kNThreads = 10; |
| 242 #else | 246 #else |
| 243 const int kNThreads = 50; | 247 const int kNThreads = 50; |
| 244 #endif | 248 #endif |
| 245 i::List<JoinableThread*> threads(kNThreads); | 249 i::List<JoinableThread*> threads(kNThreads); |
| 246 for (int i = 0; i < kNThreads; i++) { | 250 for (int i = 0; i < kNThreads; i++) { |
| 247 threads.Add(new IsolateNonlockingThread()); | 251 threads.Add(new IsolateNonlockingThread()); |
| 248 } | 252 } |
| 249 StartJoinAndDeleteThreads(threads); | 253 StartJoinAndDeleteThreads(threads); |
| 250 } | 254 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 268 v8::Locker another_lock(isolate_); | 272 v8::Locker another_lock(isolate_); |
| 269 CalcFibAndCheck(); | 273 CalcFibAndCheck(); |
| 270 } | 274 } |
| 271 } | 275 } |
| 272 private: | 276 private: |
| 273 v8::Isolate* isolate_; | 277 v8::Isolate* isolate_; |
| 274 }; | 278 }; |
| 275 | 279 |
| 276 // Run many threads with nested locks | 280 // Run many threads with nested locks |
| 277 TEST(IsolateNestedLocking) { | 281 TEST(IsolateNestedLocking) { |
| 282 #ifdef V8_TARGET_ARCH_MIPS |
| 283 const int kNThreads = 50; |
| 284 #else |
| 278 const int kNThreads = 100; | 285 const int kNThreads = 100; |
| 286 #endif |
| 279 v8::Isolate* isolate = v8::Isolate::New(); | 287 v8::Isolate* isolate = v8::Isolate::New(); |
| 280 i::List<JoinableThread*> threads(kNThreads); | 288 i::List<JoinableThread*> threads(kNThreads); |
| 281 for (int i = 0; i < kNThreads; i++) { | 289 for (int i = 0; i < kNThreads; i++) { |
| 282 threads.Add(new IsolateNestedLockingThread(isolate)); | 290 threads.Add(new IsolateNestedLockingThread(isolate)); |
| 283 } | 291 } |
| 284 StartJoinAndDeleteThreads(threads); | 292 StartJoinAndDeleteThreads(threads); |
| 285 } | 293 } |
| 286 | 294 |
| 287 | 295 |
| 288 class SeparateIsolatesLocksNonexclusiveThread : public JoinableThread { | 296 class SeparateIsolatesLocksNonexclusiveThread : public JoinableThread { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 304 CalcFibAndCheck(); | 312 CalcFibAndCheck(); |
| 305 threadB.Join(); | 313 threadB.Join(); |
| 306 } | 314 } |
| 307 private: | 315 private: |
| 308 v8::Isolate* isolate1_; | 316 v8::Isolate* isolate1_; |
| 309 v8::Isolate* isolate2_; | 317 v8::Isolate* isolate2_; |
| 310 }; | 318 }; |
| 311 | 319 |
| 312 // Run parallel threads that lock and access different isolates in parallel | 320 // Run parallel threads that lock and access different isolates in parallel |
| 313 TEST(SeparateIsolatesLocksNonexclusive) { | 321 TEST(SeparateIsolatesLocksNonexclusive) { |
| 314 #ifdef V8_TARGET_ARCH_ARM | 322 #if defined(V8_TARGET_ARCH_ARM) || defined(V8_TARGET_ARCH_MIPS) |
| 315 const int kNThreads = 50; | 323 const int kNThreads = 50; |
| 316 #else | 324 #else |
| 317 const int kNThreads = 100; | 325 const int kNThreads = 100; |
| 318 #endif | 326 #endif |
| 319 v8::Isolate* isolate1 = v8::Isolate::New(); | 327 v8::Isolate* isolate1 = v8::Isolate::New(); |
| 320 v8::Isolate* isolate2 = v8::Isolate::New(); | 328 v8::Isolate* isolate2 = v8::Isolate::New(); |
| 321 i::List<JoinableThread*> threads(kNThreads); | 329 i::List<JoinableThread*> threads(kNThreads); |
| 322 for (int i = 0; i < kNThreads; i++) { | 330 for (int i = 0; i < kNThreads; i++) { |
| 323 threads.Add(new SeparateIsolatesLocksNonexclusiveThread(isolate1, | 331 threads.Add(new SeparateIsolatesLocksNonexclusiveThread(isolate1, |
| 324 isolate2)); | 332 isolate2)); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 CalcFibAndCheck(); | 386 CalcFibAndCheck(); |
| 379 } | 387 } |
| 380 } | 388 } |
| 381 | 389 |
| 382 private: | 390 private: |
| 383 v8::Isolate* isolate_; | 391 v8::Isolate* isolate_; |
| 384 }; | 392 }; |
| 385 | 393 |
| 386 // Use unlocker inside of a Locker, multiple threads. | 394 // Use unlocker inside of a Locker, multiple threads. |
| 387 TEST(LockerUnlocker) { | 395 TEST(LockerUnlocker) { |
| 388 #ifdef V8_TARGET_ARCH_ARM | 396 #if defined(V8_TARGET_ARCH_ARM) || defined(V8_TARGET_ARCH_MIPS) |
| 389 const int kNThreads = 50; | 397 const int kNThreads = 50; |
| 390 #else | 398 #else |
| 391 const int kNThreads = 100; | 399 const int kNThreads = 100; |
| 392 #endif | 400 #endif |
| 393 i::List<JoinableThread*> threads(kNThreads); | 401 i::List<JoinableThread*> threads(kNThreads); |
| 394 v8::Isolate* isolate = v8::Isolate::New(); | 402 v8::Isolate* isolate = v8::Isolate::New(); |
| 395 for (int i = 0; i < kNThreads; i++) { | 403 for (int i = 0; i < kNThreads; i++) { |
| 396 threads.Add(new LockerUnlockerThread(isolate)); | 404 threads.Add(new LockerUnlockerThread(isolate)); |
| 397 } | 405 } |
| 398 StartJoinAndDeleteThreads(threads); | 406 StartJoinAndDeleteThreads(threads); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 431 CalcFibAndCheck(); | 439 CalcFibAndCheck(); |
| 432 } | 440 } |
| 433 } | 441 } |
| 434 | 442 |
| 435 private: | 443 private: |
| 436 v8::Isolate* isolate_; | 444 v8::Isolate* isolate_; |
| 437 }; | 445 }; |
| 438 | 446 |
| 439 // Use Unlocker inside two Lockers. | 447 // Use Unlocker inside two Lockers. |
| 440 TEST(LockTwiceAndUnlock) { | 448 TEST(LockTwiceAndUnlock) { |
| 441 #ifdef V8_TARGET_ARCH_ARM | 449 #if defined(V8_TARGET_ARCH_ARM) || defined(V8_TARGET_ARCH_MIPS) |
| 442 const int kNThreads = 50; | 450 const int kNThreads = 50; |
| 443 #else | 451 #else |
| 444 const int kNThreads = 100; | 452 const int kNThreads = 100; |
| 445 #endif | 453 #endif |
| 446 i::List<JoinableThread*> threads(kNThreads); | 454 i::List<JoinableThread*> threads(kNThreads); |
| 447 v8::Isolate* isolate = v8::Isolate::New(); | 455 v8::Isolate* isolate = v8::Isolate::New(); |
| 448 for (int i = 0; i < kNThreads; i++) { | 456 for (int i = 0; i < kNThreads; i++) { |
| 449 threads.Add(new LockTwiceAndUnlockThread(isolate)); | 457 threads.Add(new LockTwiceAndUnlockThread(isolate)); |
| 450 } | 458 } |
| 451 StartJoinAndDeleteThreads(threads); | 459 StartJoinAndDeleteThreads(threads); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 552 } | 560 } |
| 553 } | 561 } |
| 554 | 562 |
| 555 private: | 563 private: |
| 556 v8::Isolate* isolate_; | 564 v8::Isolate* isolate_; |
| 557 v8::Persistent<v8::Context> context_; | 565 v8::Persistent<v8::Context> context_; |
| 558 }; | 566 }; |
| 559 | 567 |
| 560 // Locker inside an Unlocker inside a Locker. | 568 // Locker inside an Unlocker inside a Locker. |
| 561 TEST(LockUnlockLockMultithreaded) { | 569 TEST(LockUnlockLockMultithreaded) { |
| 570 #ifdef V8_TARGET_ARCH_MIPS |
| 571 const int kNThreads = 50; |
| 572 #else |
| 562 const int kNThreads = 100; | 573 const int kNThreads = 100; |
| 574 #endif |
| 563 v8::Isolate* isolate = v8::Isolate::New(); | 575 v8::Isolate* isolate = v8::Isolate::New(); |
| 564 Persistent<v8::Context> context; | 576 Persistent<v8::Context> context; |
| 565 { | 577 { |
| 566 v8::Locker locker_(isolate); | 578 v8::Locker locker_(isolate); |
| 567 v8::Isolate::Scope isolate_scope(isolate); | 579 v8::Isolate::Scope isolate_scope(isolate); |
| 568 v8::HandleScope handle_scope; | 580 v8::HandleScope handle_scope; |
| 569 context = v8::Context::New(); | 581 context = v8::Context::New(); |
| 570 } | 582 } |
| 571 i::List<JoinableThread*> threads(kNThreads); | 583 i::List<JoinableThread*> threads(kNThreads); |
| 572 for (int i = 0; i < kNThreads; i++) { | 584 for (int i = 0; i < kNThreads; i++) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 599 } | 611 } |
| 600 } | 612 } |
| 601 } | 613 } |
| 602 | 614 |
| 603 private: | 615 private: |
| 604 v8::Persistent<v8::Context> context_; | 616 v8::Persistent<v8::Context> context_; |
| 605 }; | 617 }; |
| 606 | 618 |
| 607 // Locker inside an Unlocker inside a Locker for default isolate. | 619 // Locker inside an Unlocker inside a Locker for default isolate. |
| 608 TEST(LockUnlockLockDefaultIsolateMultithreaded) { | 620 TEST(LockUnlockLockDefaultIsolateMultithreaded) { |
| 621 #ifdef V8_TARGET_ARCH_MIPS |
| 622 const int kNThreads = 50; |
| 623 #else |
| 609 const int kNThreads = 100; | 624 const int kNThreads = 100; |
| 625 #endif |
| 610 Persistent<v8::Context> context; | 626 Persistent<v8::Context> context; |
| 611 { | 627 { |
| 612 v8::Locker locker_; | 628 v8::Locker locker_; |
| 613 v8::HandleScope handle_scope; | 629 v8::HandleScope handle_scope; |
| 614 context = v8::Context::New(); | 630 context = v8::Context::New(); |
| 615 } | 631 } |
| 616 i::List<JoinableThread*> threads(kNThreads); | 632 i::List<JoinableThread*> threads(kNThreads); |
| 617 for (int i = 0; i < kNThreads; i++) { | 633 for (int i = 0; i < kNThreads; i++) { |
| 618 threads.Add(new LockUnlockLockDefaultIsolateThread(context)); | 634 threads.Add(new LockUnlockLockDefaultIsolateThread(context)); |
| 619 } | 635 } |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 667 isolate->Dispose(); | 683 isolate->Dispose(); |
| 668 } | 684 } |
| 669 private: | 685 private: |
| 670 int count_; | 686 int count_; |
| 671 const char** extension_names_; | 687 const char** extension_names_; |
| 672 }; | 688 }; |
| 673 | 689 |
| 674 // Test installing extensions in separate isolates concurrently. | 690 // Test installing extensions in separate isolates concurrently. |
| 675 // http://code.google.com/p/v8/issues/detail?id=1821 | 691 // http://code.google.com/p/v8/issues/detail?id=1821 |
| 676 TEST(ExtensionsRegistration) { | 692 TEST(ExtensionsRegistration) { |
| 677 #ifdef V8_TARGET_ARCH_ARM | 693 #if defined(V8_TARGET_ARCH_ARM) || defined(V8_TARGET_ARCH_MIPS) |
| 678 const int kNThreads = 10; | 694 const int kNThreads = 10; |
| 679 #else | 695 #else |
| 680 const int kNThreads = 40; | 696 const int kNThreads = 40; |
| 681 #endif | 697 #endif |
| 682 v8::RegisterExtension(new v8::Extension("test0", | 698 v8::RegisterExtension(new v8::Extension("test0", |
| 683 kSimpleExtensionSource)); | 699 kSimpleExtensionSource)); |
| 684 v8::RegisterExtension(new v8::Extension("test1", | 700 v8::RegisterExtension(new v8::Extension("test1", |
| 685 kSimpleExtensionSource)); | 701 kSimpleExtensionSource)); |
| 686 v8::RegisterExtension(new v8::Extension("test2", | 702 v8::RegisterExtension(new v8::Extension("test2", |
| 687 kSimpleExtensionSource)); | 703 kSimpleExtensionSource)); |
| 688 v8::RegisterExtension(new v8::Extension("test3", | 704 v8::RegisterExtension(new v8::Extension("test3", |
| 689 kSimpleExtensionSource)); | 705 kSimpleExtensionSource)); |
| 690 v8::RegisterExtension(new v8::Extension("test4", | 706 v8::RegisterExtension(new v8::Extension("test4", |
| 691 kSimpleExtensionSource)); | 707 kSimpleExtensionSource)); |
| 692 v8::RegisterExtension(new v8::Extension("test5", | 708 v8::RegisterExtension(new v8::Extension("test5", |
| 693 kSimpleExtensionSource)); | 709 kSimpleExtensionSource)); |
| 694 v8::RegisterExtension(new v8::Extension("test6", | 710 v8::RegisterExtension(new v8::Extension("test6", |
| 695 kSimpleExtensionSource)); | 711 kSimpleExtensionSource)); |
| 696 v8::RegisterExtension(new v8::Extension("test7", | 712 v8::RegisterExtension(new v8::Extension("test7", |
| 697 kSimpleExtensionSource)); | 713 kSimpleExtensionSource)); |
| 698 const char* extension_names[] = { "test0", "test1", | 714 const char* extension_names[] = { "test0", "test1", |
| 699 "test2", "test3", "test4", | 715 "test2", "test3", "test4", |
| 700 "test5", "test6", "test7" }; | 716 "test5", "test6", "test7" }; |
| 701 i::List<JoinableThread*> threads(kNThreads); | 717 i::List<JoinableThread*> threads(kNThreads); |
| 702 for (int i = 0; i < kNThreads; i++) { | 718 for (int i = 0; i < kNThreads; i++) { |
| 703 threads.Add(new IsolateGenesisThread(8, extension_names)); | 719 threads.Add(new IsolateGenesisThread(8, extension_names)); |
| 704 } | 720 } |
| 705 StartJoinAndDeleteThreads(threads); | 721 StartJoinAndDeleteThreads(threads); |
| 706 } | 722 } |
| OLD | NEW |