Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(32)

Side by Side Diff: Source/platform/heap/HeapTest.cpp

Issue 1303153005: Introduce WebTaskRunner Patch 3/5 (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Add missing #include Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 447 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 int IntWrapper::s_destructorCalls = 0; 458 int IntWrapper::s_destructorCalls = 0;
459 int OffHeapInt::s_destructorCalls = 0; 459 int OffHeapInt::s_destructorCalls = 0;
460 460
461 class ThreadedTesterBase { 461 class ThreadedTesterBase {
462 protected: 462 protected:
463 static void test(ThreadedTesterBase* tester) 463 static void test(ThreadedTesterBase* tester)
464 { 464 {
465 Vector<OwnPtr<WebThread>, numberOfThreads> m_threads; 465 Vector<OwnPtr<WebThread>, numberOfThreads> m_threads;
466 for (int i = 0; i < numberOfThreads; i++) { 466 for (int i = 0; i < numberOfThreads; i++) {
467 m_threads.append(adoptPtr(Platform::current()->createThread("blink g c testing thread"))); 467 m_threads.append(adoptPtr(Platform::current()->createThread("blink g c testing thread")));
468 m_threads.last()->postTask(FROM_HERE, new Task(threadSafeBind(thread Func, AllowCrossThreadAccess(tester)))); 468 m_threads.last()->taskRunner()->postTask(FROM_HERE, new Task(threadS afeBind(threadFunc, AllowCrossThreadAccess(tester))));
469 } 469 }
470 while (tester->m_threadsToFinish) { 470 while (tester->m_threadsToFinish) {
471 SafePointScope scope(ThreadState::NoHeapPointersOnStack); 471 SafePointScope scope(ThreadState::NoHeapPointersOnStack);
472 Platform::current()->yieldCurrentThread(); 472 Platform::current()->yieldCurrentThread();
473 } 473 }
474 delete tester; 474 delete tester;
475 } 475 }
476 476
477 virtual void runThread() = 0; 477 virtual void runThread() = 0;
478 478
(...skipping 4152 matching lines...) Expand 10 before | Expand all | Expand 10 after
4631 } 4631 }
4632 preciselyCollectGarbage(); 4632 preciselyCollectGarbage();
4633 EXPECT_EQ(3, IntWrapper::s_destructorCalls); 4633 EXPECT_EQ(3, IntWrapper::s_destructorCalls);
4634 } 4634 }
4635 4635
4636 class GCParkingThreadTester { 4636 class GCParkingThreadTester {
4637 public: 4637 public:
4638 static void test() 4638 static void test()
4639 { 4639 {
4640 OwnPtr<WebThread> sleepingThread = adoptPtr(Platform::current()->createT hread("SleepingThread")); 4640 OwnPtr<WebThread> sleepingThread = adoptPtr(Platform::current()->createT hread("SleepingThread"));
4641 sleepingThread->postTask(FROM_HERE, new Task(threadSafeBind(sleeperMainF unc))); 4641 sleepingThread->taskRunner()->postTask(FROM_HERE, new Task(threadSafeBin d(sleeperMainFunc)));
4642 4642
4643 // Wait for the sleeper to run. 4643 // Wait for the sleeper to run.
4644 while (!s_sleeperRunning) { 4644 while (!s_sleeperRunning) {
4645 Platform::current()->yieldCurrentThread(); 4645 Platform::current()->yieldCurrentThread();
4646 } 4646 }
4647 4647
4648 { 4648 {
4649 // Expect the first attempt to park the sleeping thread to fail 4649 // Expect the first attempt to park the sleeping thread to fail
4650 TestGCScope scope(ThreadState::NoHeapPointersOnStack); 4650 TestGCScope scope(ThreadState::NoHeapPointersOnStack);
4651 EXPECT_FALSE(scope.allThreadsParked()); 4651 EXPECT_FALSE(scope.allThreadsParked());
(...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after
5301 } 5301 }
5302 5302
5303 class DeadBitTester { 5303 class DeadBitTester {
5304 public: 5304 public:
5305 static void test() 5305 static void test()
5306 { 5306 {
5307 IntWrapper::s_destructorCalls = 0; 5307 IntWrapper::s_destructorCalls = 0;
5308 5308
5309 MutexLocker locker(mainThreadMutex()); 5309 MutexLocker locker(mainThreadMutex());
5310 OwnPtr<WebThread> workerThread = adoptPtr(Platform::current()->createThr ead("Test Worker Thread")); 5310 OwnPtr<WebThread> workerThread = adoptPtr(Platform::current()->createThr ead("Test Worker Thread"));
5311 workerThread->postTask(FROM_HERE, new Task(threadSafeBind(workerThreadMa in))); 5311 workerThread->taskRunner()->postTask(FROM_HERE, new Task(threadSafeBind( workerThreadMain)));
5312 5312
5313 // Wait for the worker thread to have done its initialization, 5313 // Wait for the worker thread to have done its initialization,
5314 // IE. the worker allocates an object and then throw aways any 5314 // IE. the worker allocates an object and then throw aways any
5315 // pointers to it. 5315 // pointers to it.
5316 parkMainThread(); 5316 parkMainThread();
5317 5317
5318 // Now do a GC. This will not find the worker threads object since it 5318 // Now do a GC. This will not find the worker threads object since it
5319 // is not referred from any of the threads. Even a conservative 5319 // is not referred from any of the threads. Even a conservative
5320 // GC will not find it. 5320 // GC will not find it.
5321 // Also at this point the worker is waiting for the main thread 5321 // Also at this point the worker is waiting for the main thread
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
5404 } 5404 }
5405 5405
5406 class ThreadedStrongificationTester { 5406 class ThreadedStrongificationTester {
5407 public: 5407 public:
5408 static void test() 5408 static void test()
5409 { 5409 {
5410 IntWrapper::s_destructorCalls = 0; 5410 IntWrapper::s_destructorCalls = 0;
5411 5411
5412 MutexLocker locker(mainThreadMutex()); 5412 MutexLocker locker(mainThreadMutex());
5413 OwnPtr<WebThread> workerThread = adoptPtr(Platform::current()->createThr ead("Test Worker Thread")); 5413 OwnPtr<WebThread> workerThread = adoptPtr(Platform::current()->createThr ead("Test Worker Thread"));
5414 workerThread->postTask(FROM_HERE, new Task(threadSafeBind(workerThreadMa in))); 5414 workerThread->taskRunner()->postTask(FROM_HERE, new Task(threadSafeBind( workerThreadMain)));
5415 5415
5416 // Wait for the worker thread initialization. The worker 5416 // Wait for the worker thread initialization. The worker
5417 // allocates a weak collection where both collection and 5417 // allocates a weak collection where both collection and
5418 // contents are kept alive via persistent pointers. 5418 // contents are kept alive via persistent pointers.
5419 parkMainThread(); 5419 parkMainThread();
5420 5420
5421 // Perform two garbage collections where the worker thread does 5421 // Perform two garbage collections where the worker thread does
5422 // not wake up in between. This will cause us to remove marks 5422 // not wake up in between. This will cause us to remove marks
5423 // and mark unmarked objects dead. The collection on the worker 5423 // and mark unmarked objects dead. The collection on the worker
5424 // heap is found through the persistent and the backing should 5424 // heap is found through the persistent and the backing should
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
5607 int DestructorLockingObject::s_destructorCalls = 0; 5607 int DestructorLockingObject::s_destructorCalls = 0;
5608 5608
5609 class RecursiveLockingTester { 5609 class RecursiveLockingTester {
5610 public: 5610 public:
5611 static void test() 5611 static void test()
5612 { 5612 {
5613 DestructorLockingObject::s_destructorCalls = 0; 5613 DestructorLockingObject::s_destructorCalls = 0;
5614 5614
5615 MutexLocker locker(mainThreadMutex()); 5615 MutexLocker locker(mainThreadMutex());
5616 OwnPtr<WebThread> workerThread = adoptPtr(Platform::current()->createThr ead("Test Worker Thread")); 5616 OwnPtr<WebThread> workerThread = adoptPtr(Platform::current()->createThr ead("Test Worker Thread"));
5617 workerThread->postTask(FROM_HERE, new Task(threadSafeBind(workerThreadMa in))); 5617 workerThread->taskRunner()->postTask(FROM_HERE, new Task(threadSafeBind( workerThreadMain)));
5618 5618
5619 // Park the main thread until the worker thread has initialized. 5619 // Park the main thread until the worker thread has initialized.
5620 parkMainThread(); 5620 parkMainThread();
5621 5621
5622 { 5622 {
5623 SafePointAwareMutexLocker recursiveLocker(recursiveMutex()); 5623 SafePointAwareMutexLocker recursiveLocker(recursiveMutex());
5624 5624
5625 // Let the worker try to acquire the above mutex. It won't get it 5625 // Let the worker try to acquire the above mutex. It won't get it
5626 // until the main thread has done its GC. 5626 // until the main thread has done its GC.
5627 wakeWorkerThread(); 5627 wakeWorkerThread();
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
5681 { 5681 {
5682 RecursiveLockingTester::test(); 5682 RecursiveLockingTester::test();
5683 } 5683 }
5684 5684
5685 class CrossThreadPersistentOnMainThreadTester { 5685 class CrossThreadPersistentOnMainThreadTester {
5686 public: 5686 public:
5687 static void test() 5687 static void test()
5688 { 5688 {
5689 MutexLocker locker(mainThreadMutex()); 5689 MutexLocker locker(mainThreadMutex());
5690 OwnPtr<WebThread> workerThread = adoptPtr(Platform::current()->createThr ead("Test Worker Thread")); 5690 OwnPtr<WebThread> workerThread = adoptPtr(Platform::current()->createThr ead("Test Worker Thread"));
5691 workerThread->postTask(FROM_HERE, new Task(threadSafeBind(workerThreadMa in))); 5691 workerThread->taskRunner()->postTask(FROM_HERE, new Task(threadSafeBind( workerThreadMain)));
5692 5692
5693 parkMainThread(); 5693 parkMainThread();
5694 5694
5695 // (Temporarily) detach main thread and wake the worker thread, so that it 5695 // (Temporarily) detach main thread and wake the worker thread, so that it
5696 // can do its detach(). 5696 // can do its detach().
5697 ThreadState::detachMainThread(); 5697 ThreadState::detachMainThread();
5698 wakeWorkerThread(); 5698 wakeWorkerThread();
5699 5699
5700 parkMainThread(); 5700 parkMainThread();
5701 ThreadState::attachMainThread(); 5701 ThreadState::attachMainThread();
(...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after
6399 // Create an object in the worker thread, have a CrossThreadWeakPersistent p ointing to it on the main thread, 6399 // Create an object in the worker thread, have a CrossThreadWeakPersistent p ointing to it on the main thread,
6400 // clear the reference in the worker thread, run a GC in the worker thread, and see if the 6400 // clear the reference in the worker thread, run a GC in the worker thread, and see if the
6401 // CrossThreadWeakPersistent is cleared. 6401 // CrossThreadWeakPersistent is cleared.
6402 6402
6403 DestructorLockingObject::s_destructorCalls = 0; 6403 DestructorLockingObject::s_destructorCalls = 0;
6404 6404
6405 // Step 1: Initiate a worker thread, and wait for |object| to get allocated on the worker thread. 6405 // Step 1: Initiate a worker thread, and wait for |object| to get allocated on the worker thread.
6406 MutexLocker mainThreadMutexLocker(mainThreadMutex()); 6406 MutexLocker mainThreadMutexLocker(mainThreadMutex());
6407 OwnPtr<WebThread> workerThread = adoptPtr(Platform::current()->createThread( "Test Worker Thread")); 6407 OwnPtr<WebThread> workerThread = adoptPtr(Platform::current()->createThread( "Test Worker Thread"));
6408 DestructorLockingObject* object = nullptr; 6408 DestructorLockingObject* object = nullptr;
6409 workerThread->postTask(FROM_HERE, new Task(threadSafeBind(workerThreadMainFo rCrossThreadWeakPersistentTest, AllowCrossThreadAccessWrapper<DestructorLockingO bject**>(&object)))); 6409 workerThread->taskRunner()->postTask(FROM_HERE, new Task(threadSafeBind(work erThreadMainForCrossThreadWeakPersistentTest, AllowCrossThreadAccessWrapper<Dest ructorLockingObject**>(&object))));
6410 parkMainThread(); 6410 parkMainThread();
6411 6411
6412 // Step 3: Set up a CrossThreadWeakPersistent. 6412 // Step 3: Set up a CrossThreadWeakPersistent.
6413 ASSERT_TRUE(object); 6413 ASSERT_TRUE(object);
6414 CrossThreadWeakPersistent<DestructorLockingObject> crossThreadWeakPersistent (object); 6414 CrossThreadWeakPersistent<DestructorLockingObject> crossThreadWeakPersistent (object);
6415 object = nullptr; 6415 object = nullptr;
6416 { 6416 {
6417 SafePointAwareMutexLocker recursiveMutexLocker(recursiveMutex()); 6417 SafePointAwareMutexLocker recursiveMutexLocker(recursiveMutex());
6418 EXPECT_EQ(0, DestructorLockingObject::s_destructorCalls); 6418 EXPECT_EQ(0, DestructorLockingObject::s_destructorCalls);
6419 } 6419 }
(...skipping 10 matching lines...) Expand all
6430 { 6430 {
6431 SafePointAwareMutexLocker recursiveMutexLocker(recursiveMutex()); 6431 SafePointAwareMutexLocker recursiveMutexLocker(recursiveMutex());
6432 EXPECT_EQ(1, DestructorLockingObject::s_destructorCalls); 6432 EXPECT_EQ(1, DestructorLockingObject::s_destructorCalls);
6433 } 6433 }
6434 6434
6435 wakeWorkerThread(); 6435 wakeWorkerThread();
6436 parkMainThread(); 6436 parkMainThread();
6437 } 6437 }
6438 6438
6439 } // namespace blink 6439 } // namespace blink
OLDNEW
« no previous file with comments | « Source/platform/graphics/RecordingImageBufferSurfaceTest.cpp ('k') | Source/platform/heap/glue/MessageLoopInterruptor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698