Revision: 3971
Author: [email protected]
Date: Fri Feb 26 03:51:33 2010
Log: Add an explicit API entry to notify V8 that one or more
contexts have been disposed.
Review URL: http://codereview.chromium.org/661173
http://code.google.com/p/v8/source/detail?r=3971
Modified:
/branches/bleeding_edge/include/v8.h
/branches/bleeding_edge/src/api.cc
/branches/bleeding_edge/src/heap.cc
/branches/bleeding_edge/src/heap.h
=======================================
--- /branches/bleeding_edge/include/v8.h Wed Feb 17 05:23:46 2010
+++ /branches/bleeding_edge/include/v8.h Fri Feb 26 03:51:33 2010
@@ -2473,6 +2473,13 @@
*/
static void LowMemoryNotification();
+ /**
+ * Optional notification that one or more context have been
+ * disposed. V8 may choose to collect garbage to get rid of any
+ * external memory associated with the disposed contexts.
+ */
+ static void ContextDisposedNotification();
+
private:
V8();
=======================================
--- /branches/bleeding_edge/src/api.cc Thu Feb 18 07:10:35 2010
+++ /branches/bleeding_edge/src/api.cc Fri Feb 26 03:51:33 2010
@@ -2819,6 +2819,12 @@
if (!i::V8::IsRunning()) return;
i::Heap::CollectAllGarbage(true);
}
+
+
+void v8::V8::ContextDisposedNotification() {
+ if (!i::V8::IsRunning()) return;
+ i::Heap::CollectAllGarbageIfContextDisposed(true);
+}
const char* v8::V8::GetVersion() {
@@ -2857,7 +2863,7 @@
// decide when should make a full GC.
#else
// Give the heap a chance to cleanup if we've disposed contexts.
- i::Heap::CollectAllGarbageIfContextDisposed();
+ i::Heap::CollectAllGarbageIfContextDisposed(false);
#endif
v8::Handle<ObjectTemplate> proxy_template = global_template;
i::Handle<i::FunctionTemplateInfo> proxy_constructor;
=======================================
--- /branches/bleeding_edge/src/heap.cc Fri Feb 26 03:48:18 2010
+++ /branches/bleeding_edge/src/heap.cc Fri Feb 26 03:51:33 2010
@@ -371,12 +371,20 @@
}
-void Heap::CollectAllGarbageIfContextDisposed() {
+void Heap::CollectAllGarbageIfContextDisposed(bool notified) {
+ // If the request has ever been the result of an explicit
+ // notification, we ignore non-notified requests. This is a
+ // temporary solution to let the two ways of achieving GC at
+ // context disposal time co-exist.
+ static bool ever_notified = false;
+ if (notified) ever_notified = true;
+ if (ever_notified && !notified) return;
+
// If the garbage collector interface is exposed through the global
// gc() function, we avoid being clever about forcing GCs when
// contexts are disposed and leave it to the embedder to make
// informed decisions about when to force a collection.
- if (!FLAG_expose_gc && context_disposed_pending_) {
+ if (!FLAG_expose_gc && (notified || context_disposed_pending_)) {
HistogramTimerScope scope(&Counters::gc_context);
CollectAllGarbage(false);
}
=======================================
--- /branches/bleeding_edge/src/heap.h Fri Feb 26 00:27:20 2010
+++ /branches/bleeding_edge/src/heap.h Fri Feb 26 03:51:33 2010
@@ -634,7 +634,7 @@
// Performs a full garbage collection if a context has been disposed
// since the last time the check was performed.
- static void CollectAllGarbageIfContextDisposed();
+ static void CollectAllGarbageIfContextDisposed(bool notified);
// Notify the heap that a context has been disposed.
static void NotifyContextDisposed();
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev