| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 492 }; | 492 }; |
| 493 | 493 |
| 494 class ThreadedHeapTester : public ThreadedTesterBase { | 494 class ThreadedHeapTester : public ThreadedTesterBase { |
| 495 public: | 495 public: |
| 496 static void test() | 496 static void test() |
| 497 { | 497 { |
| 498 ThreadedTesterBase::test(new ThreadedHeapTester); | 498 ThreadedTesterBase::test(new ThreadedHeapTester); |
| 499 } | 499 } |
| 500 | 500 |
| 501 protected: | 501 protected: |
| 502 using GlobalIntWrapperPersistent = CrossThreadPersistent<IntWrapper>; |
| 503 |
| 504 PassOwnPtr<GlobalIntWrapperPersistent> createGlobalPersistent(int value) |
| 505 { |
| 506 return adoptPtr(new GlobalIntWrapperPersistent(IntWrapper::create(value)
)); |
| 507 } |
| 508 |
| 502 void runThread() override | 509 void runThread() override |
| 503 { | 510 { |
| 511 OwnPtr<GlobalIntWrapperPersistent> longLivingPersistent; |
| 504 ThreadState::attach(); | 512 ThreadState::attach(); |
| 505 | 513 |
| 514 longLivingPersistent = createGlobalPersistent(0x2a2a2a2a); |
| 506 int gcCount = 0; | 515 int gcCount = 0; |
| 507 while (!done()) { | 516 while (!done()) { |
| 508 ThreadState::current()->safePoint(ThreadState::NoHeapPointersOnStack
); | 517 ThreadState::current()->safePoint(ThreadState::NoHeapPointersOnStack
); |
| 509 { | 518 { |
| 510 Persistent<IntWrapper> wrapper; | 519 Persistent<IntWrapper> wrapper; |
| 511 | 520 |
| 512 typedef CrossThreadPersistent<IntWrapper> GlobalIntWrapperPersis
tent; | 521 OwnPtr<GlobalIntWrapperPersistent> globalPersistent = createGlob
alPersistent(0x0ed0cabb); |
| 513 OwnPtr<GlobalIntWrapperPersistent> globalPersistent = adoptPtr(n
ew GlobalIntWrapperPersistent(IntWrapper::create(0x0ed0cabb))); | |
| 514 | 522 |
| 515 for (int i = 0; i < numberOfAllocations; i++) { | 523 for (int i = 0; i < numberOfAllocations; i++) { |
| 516 wrapper = IntWrapper::create(0x0bbac0de); | 524 wrapper = IntWrapper::create(0x0bbac0de); |
| 517 if (!(i % 10)) { | 525 if (!(i % 10)) { |
| 518 globalPersistent = adoptPtr(new GlobalIntWrapperPersiste
nt(IntWrapper::create(0x0ed0cabb))); | 526 globalPersistent = createGlobalPersistent(0x0ed0cabb); |
| 519 } | 527 } |
| 520 SafePointScope scope(ThreadState::NoHeapPointersOnStack); | 528 SafePointScope scope(ThreadState::NoHeapPointersOnStack); |
| 521 Platform::current()->yieldCurrentThread(); | 529 Platform::current()->yieldCurrentThread(); |
| 522 } | 530 } |
| 523 | 531 |
| 524 if (gcCount < gcPerThread) { | 532 if (gcCount < gcPerThread) { |
| 525 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack, Thr
eadState::GCWithSweep, Heap::ForcedGC); | 533 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack, Thr
eadState::GCWithSweep, Heap::ForcedGC); |
| 526 gcCount++; | 534 gcCount++; |
| 527 atomicIncrement(&m_gcCount); | 535 atomicIncrement(&m_gcCount); |
| 528 } | 536 } |
| 529 | 537 |
| 530 // Taking snapshot shouldn't have any bad side effect. | 538 // Taking snapshot shouldn't have any bad side effect. |
| 531 // TODO(haraken): This snapshot GC causes crashes, so disable | 539 // TODO(haraken): This snapshot GC causes crashes, so disable |
| 532 // it at the moment. Fix the crash and enable it. | 540 // it at the moment. Fix the crash and enable it. |
| 533 // Heap::collectGarbage(ThreadState::NoHeapPointersOnStack, Thre
adState::TakeSnapshot, Heap::ForcedGC); | 541 // Heap::collectGarbage(ThreadState::NoHeapPointersOnStack, Thre
adState::TakeSnapshot, Heap::ForcedGC); |
| 534 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack, ThreadS
tate::GCWithSweep, Heap::ForcedGC); | 542 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack, ThreadS
tate::GCWithSweep, Heap::ForcedGC); |
| 535 EXPECT_EQ(wrapper->value(), 0x0bbac0de); | 543 EXPECT_EQ(wrapper->value(), 0x0bbac0de); |
| 536 EXPECT_EQ((*globalPersistent)->value(), 0x0ed0cabb); | 544 EXPECT_EQ((*globalPersistent)->value(), 0x0ed0cabb); |
| 537 } | 545 } |
| 538 SafePointScope scope(ThreadState::NoHeapPointersOnStack); | 546 SafePointScope scope(ThreadState::NoHeapPointersOnStack); |
| 539 Platform::current()->yieldCurrentThread(); | 547 Platform::current()->yieldCurrentThread(); |
| 540 } | 548 } |
| 549 |
| 550 // Intentionally leak the cross-thread persistent so as to verify |
| 551 // that later GCs correctly handle cross-thread persistents that |
| 552 // refer to finalized objects after their heaps have been detached |
| 553 // and freed. |
| 554 EXPECT_TRUE(longLivingPersistent.leakPtr()); |
| 555 |
| 541 ThreadState::detach(); | 556 ThreadState::detach(); |
| 542 atomicDecrement(&m_threadsToFinish); | 557 atomicDecrement(&m_threadsToFinish); |
| 543 } | 558 } |
| 544 }; | 559 }; |
| 545 | 560 |
| 546 class ThreadedWeaknessTester : public ThreadedTesterBase { | 561 class ThreadedWeaknessTester : public ThreadedTesterBase { |
| 547 public: | 562 public: |
| 548 static void test() | 563 static void test() |
| 549 { | 564 { |
| 550 ThreadedTesterBase::test(new ThreadedWeaknessTester); | 565 ThreadedTesterBase::test(new ThreadedWeaknessTester); |
| (...skipping 5722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6273 { | 6288 { |
| 6274 Persistent<ClassWithMember> object = ClassWithMember::create(); | 6289 Persistent<ClassWithMember> object = ClassWithMember::create(); |
| 6275 EXPECT_EQ(0, object->traceCount()); | 6290 EXPECT_EQ(0, object->traceCount()); |
| 6276 TestMixinAllocatingObject* mixin = TestMixinAllocatingObject::create(object.
get()); | 6291 TestMixinAllocatingObject* mixin = TestMixinAllocatingObject::create(object.
get()); |
| 6277 EXPECT_TRUE(mixin); | 6292 EXPECT_TRUE(mixin); |
| 6278 EXPECT_GT(object->traceCount(), 0); | 6293 EXPECT_GT(object->traceCount(), 0); |
| 6279 EXPECT_GT(mixin->traceCount(), 0); | 6294 EXPECT_GT(mixin->traceCount(), 0); |
| 6280 } | 6295 } |
| 6281 | 6296 |
| 6282 } // namespace blink | 6297 } // namespace blink |
| OLD | NEW |