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

Side by Side Diff: third_party/WebKit/Source/platform/heap/ThreadState.cpp

Issue 2765843002: Enable idle GC for worker thread heaps. (Closed)
Patch Set: Created 3 years, 9 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 552 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 ThreadState* ThreadState::fromObject(const void* object) { 563 ThreadState* ThreadState::fromObject(const void* object) {
564 ASSERT(object); 564 ASSERT(object);
565 BasePage* page = pageFromObject(object); 565 BasePage* page = pageFromObject(object);
566 ASSERT(page); 566 ASSERT(page);
567 ASSERT(page->arena()); 567 ASSERT(page->arena());
568 return page->arena()->getThreadState(); 568 return page->arena()->getThreadState();
569 } 569 }
570 570
571 void ThreadState::performIdleGC(double deadlineSeconds) { 571 void ThreadState::performIdleGC(double deadlineSeconds) {
572 ASSERT(checkThread()); 572 ASSERT(checkThread());
573 ASSERT(isMainThread());
574 ASSERT(Platform::current()->currentThread()->scheduler()); 573 ASSERT(Platform::current()->currentThread()->scheduler());
575 574
576 if (gcState() != IdleGCScheduled) 575 if (gcState() != IdleGCScheduled)
577 return; 576 return;
578 577
579 if (isGCForbidden()) { 578 if (isGCForbidden()) {
580 // If GC is forbidden at this point, try again. 579 // If GC is forbidden at this point, try again.
581 scheduleIdleGC(); 580 scheduleIdleGC();
582 return; 581 return;
583 } 582 }
(...skipping 12 matching lines...) Expand all
596 595
597 TRACE_EVENT2("blink_gc", "ThreadState::performIdleGC", "idleDeltaInSeconds", 596 TRACE_EVENT2("blink_gc", "ThreadState::performIdleGC", "idleDeltaInSeconds",
598 idleDeltaInSeconds, "estimatedMarkingTime", 597 idleDeltaInSeconds, "estimatedMarkingTime",
599 m_heap->heapStats().estimatedMarkingTime()); 598 m_heap->heapStats().estimatedMarkingTime());
600 collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithoutSweep, 599 collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithoutSweep,
601 BlinkGC::IdleGC); 600 BlinkGC::IdleGC);
602 } 601 }
603 602
604 void ThreadState::performIdleLazySweep(double deadlineSeconds) { 603 void ThreadState::performIdleLazySweep(double deadlineSeconds) {
605 ASSERT(checkThread()); 604 ASSERT(checkThread());
606 ASSERT(isMainThread());
607 605
608 // If we are not in a sweeping phase, there is nothing to do here. 606 // If we are not in a sweeping phase, there is nothing to do here.
609 if (!isSweepingInProgress()) 607 if (!isSweepingInProgress())
610 return; 608 return;
611 609
612 // This check is here to prevent performIdleLazySweep() from being called 610 // This check is here to prevent performIdleLazySweep() from being called
613 // recursively. I'm not sure if it can happen but it would be safer to have 611 // recursively. I'm not sure if it can happen but it would be safer to have
614 // the check just in case. 612 // the check just in case.
615 if (sweepForbidden()) 613 if (sweepForbidden())
616 return; 614 return;
(...skipping 22 matching lines...) Expand all
639 break; 637 break;
640 } 638 }
641 } 639 }
642 accumulateSweepingTime(WTF::currentTimeMS() - startTime); 640 accumulateSweepingTime(WTF::currentTimeMS() - startTime);
643 641
644 if (sweepCompleted) 642 if (sweepCompleted)
645 postSweep(); 643 postSweep();
646 } 644 }
647 645
648 void ThreadState::scheduleIdleGC() { 646 void ThreadState::scheduleIdleGC() {
649 // TODO(haraken): Idle GC should be supported in worker threads as well.
650 if (!isMainThread())
651 return;
652
653 if (isSweepingInProgress()) { 647 if (isSweepingInProgress()) {
654 setGCState(SweepingAndIdleGCScheduled); 648 setGCState(SweepingAndIdleGCScheduled);
655 return; 649 return;
656 } 650 }
657 651
658 // Some threads (e.g. PPAPI thread) don't have a scheduler. 652 // Some threads (e.g. PPAPI thread) don't have a scheduler.
659 if (!Platform::current()->currentThread()->scheduler()) 653 if (!Platform::current()->currentThread()->scheduler())
660 return; 654 return;
661 655
662 Platform::current()->currentThread()->scheduler()->postNonNestableIdleTask( 656 Platform::current()->currentThread()->scheduler()->postNonNestableIdleTask(
663 BLINK_FROM_HERE, 657 BLINK_FROM_HERE,
664 WTF::bind(&ThreadState::performIdleGC, WTF::unretained(this))); 658 WTF::bind(&ThreadState::performIdleGC, WTF::unretained(this)));
665 setGCState(IdleGCScheduled); 659 setGCState(IdleGCScheduled);
666 } 660 }
667 661
668 void ThreadState::scheduleIdleLazySweep() { 662 void ThreadState::scheduleIdleLazySweep() {
669 // TODO(haraken): Idle complete sweep should be supported in worker threads.
670 if (!isMainThread())
671 return;
672
673 // Some threads (e.g. PPAPI thread) don't have a scheduler. 663 // Some threads (e.g. PPAPI thread) don't have a scheduler.
674 if (!Platform::current()->currentThread()->scheduler()) 664 if (!Platform::current()->currentThread()->scheduler())
675 return; 665 return;
676 666
677 Platform::current()->currentThread()->scheduler()->postIdleTask( 667 Platform::current()->currentThread()->scheduler()->postIdleTask(
678 BLINK_FROM_HERE, 668 BLINK_FROM_HERE,
679 WTF::bind(&ThreadState::performIdleLazySweep, WTF::unretained(this))); 669 WTF::bind(&ThreadState::performIdleLazySweep, WTF::unretained(this)));
680 } 670 }
681 671
682 void ThreadState::schedulePreciseGC() { 672 void ThreadState::schedulePreciseGC() {
(...skipping 875 matching lines...) Expand 10 before | Expand all | Expand 10 after
1558 collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, 1548 collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep,
1559 BlinkGC::ForcedGC); 1549 BlinkGC::ForcedGC);
1560 size_t liveObjects = heap().heapStats().markedObjectSize(); 1550 size_t liveObjects = heap().heapStats().markedObjectSize();
1561 if (liveObjects == previousLiveObjects) 1551 if (liveObjects == previousLiveObjects)
1562 break; 1552 break;
1563 previousLiveObjects = liveObjects; 1553 previousLiveObjects = liveObjects;
1564 } 1554 }
1565 } 1555 }
1566 1556
1567 } // namespace blink 1557 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698