From 38cde8572914dbf8788a3e5dbdda0efd2056134e Mon Sep 17 00:00:00 2001 From: "jochen@chromium.org" Date: Mon, 13 Jan 2014 12:03:31 +0000 Subject: [PATCH] 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 --- include/v8.h | 20 ++++++++++++++++++++ src/api.cc | 15 +++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/include/v8.h b/include/v8.h index bcc4b3e71..d1867521f 100644 --- a/include/v8.h +++ b/include/v8.h @@ -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&); diff --git a/src/api.cc b/src/api.cc index a1a192e45..5ef6e5924 100644 --- a/src/api.cc +++ b/src/api.cc @@ -6412,6 +6412,21 @@ void Isolate::ClearInterrupt() { } +void Isolate::RequestGarbageCollectionForTesting(GarbageCollectionType type) { + CHECK(i::FLAG_expose_gc); + if (type == kMinorGarbageCollection) { + reinterpret_cast(this)->heap()->CollectGarbage( + i::NEW_SPACE, "Isolate::RequestGarbageCollection", + kGCCallbackFlagForced); + } else { + ASSERT_EQ(kFullGarbageCollection, type); + reinterpret_cast(this)->heap()->CollectAllGarbage( + i::Heap::kNoGCFlags, "Isolate::RequestGarbageCollection", + kGCCallbackFlagForced); + } +} + + Isolate* Isolate::GetCurrent() { i::Isolate* isolate = i::Isolate::UncheckedCurrent(); return reinterpret_cast(isolate); -- 2.34.1