Introduce an API mirroring the gc extension

BUG=none
R=mstarzinger@chromium.org, svenpanne@chromium.org
LOG=y

Review URL: https://codereview.chromium.org/131443008

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@18563 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
jochen@chromium.org 2014-01-13 12:03:31 +00:00
parent e9c8de04da
commit 38cde85729
2 changed files with 35 additions and 0 deletions

View File

@ -3963,6 +3963,15 @@ class V8_EXPORT Isolate {
Scope& operator=(const Scope&);
};
/**
* Types of garbage collections that can be requested via
* RequestGarbageCollectionForTesting.
*/
enum GarbageCollectionType {
kFullGarbageCollection,
kMinorGarbageCollection
};
/**
* Creates a new isolate. Does not change the currently entered
* isolate.
@ -4175,6 +4184,17 @@ class V8_EXPORT Isolate {
*/
void ClearInterrupt();
/**
* Request garbage collection in this Isolate. It is only valid to call this
* function if --expose_gc was specified.
*
* This should only be used for testing purposes and not to enforce a garbage
* collection schedule. It has strong negative impact on the garbage
* collection performance. Use IdleNotification() or LowMemoryNotification()
* instead to influence the garbage collection schedule.
*/
void RequestGarbageCollectionForTesting(GarbageCollectionType type);
private:
Isolate();
Isolate(const Isolate&);

View File

@ -6412,6 +6412,21 @@ void Isolate::ClearInterrupt() {
}
void Isolate::RequestGarbageCollectionForTesting(GarbageCollectionType type) {
CHECK(i::FLAG_expose_gc);
if (type == kMinorGarbageCollection) {
reinterpret_cast<i::Isolate*>(this)->heap()->CollectGarbage(
i::NEW_SPACE, "Isolate::RequestGarbageCollection",
kGCCallbackFlagForced);
} else {
ASSERT_EQ(kFullGarbageCollection, type);
reinterpret_cast<i::Isolate*>(this)->heap()->CollectAllGarbage(
i::Heap::kNoGCFlags, "Isolate::RequestGarbageCollection",
kGCCallbackFlagForced);
}
}
Isolate* Isolate::GetCurrent() {
i::Isolate* isolate = i::Isolate::UncheckedCurrent();
return reinterpret_cast<Isolate*>(isolate);