Diff
Modified: trunk/Source/WebCore/ChangeLog (91813 => 91814)
--- trunk/Source/WebCore/ChangeLog 2011-07-27 02:37:03 UTC (rev 91813)
+++ trunk/Source/WebCore/ChangeLog 2011-07-27 02:41:13 UTC (rev 91814)
@@ -1,3 +1,35 @@
+2011-07-26 Dmitry Lomov <[email protected]>
+
+ [V8][Chromium] Run workers in a separate v8::Isolate
+ https://bugs.webkit.org/show_bug.cgi?id=65004
+ This patch allocates a new v8::Isolate for every worker and enters it on worker thread.
+
+ Reviewed by David Levin.
+
+ Covered by existing chromium tests.
+
+ * bindings/v8/DOMDataStore.cpp:
+ (WebCore::DOMDataStore::DOMDataStore):
+ (WebCore::DOMDataStore::~DOMDataStore):
+ * bindings/v8/StaticDOMDataStore.cpp:
+ (WebCore::StaticDOMDataStore::StaticDOMDataStore):
+ (WebCore::StaticDOMDataStore::~StaticDOMDataStore):
+ * bindings/v8/StaticDOMDataStore.h:
+ * bindings/v8/V8Binding.h:
+ (WebCore::V8BindingPerIsolateData::registerDOMDataStore):
+ (WebCore::V8BindingPerIsolateData::unregisterDOMDataStore):
+ * bindings/v8/V8DOMMap.cpp:
+ (WebCore::DOMDataStoreHandle::DOMDataStoreHandle):
+ (WebCore::DOMDataStoreHandle::~DOMDataStoreHandle):
+ * bindings/v8/WorkerContextExecutionProxy.cpp:
+ (WebCore::WorkerContextExecutionProxy::WorkerContextExecutionProxy):
+ (WebCore::WorkerContextExecutionProxy::initV8):
+ * bindings/v8/WorkerContextExecutionProxy.h:
+ * bindings/v8/WorkerScriptController.cpp:
+ (WebCore::WorkerScriptController::WorkerScriptController):
+ (WebCore::WorkerScriptController::~WorkerScriptController):
+ * bindings/v8/WorkerScriptController.h:
+
2011-07-26 James Robinson <[email protected]>
[chromium] Avoid clearing the framebuffer when compositing in release builds
Modified: trunk/Source/WebCore/bindings/v8/DOMDataStore.cpp (91813 => 91814)
--- trunk/Source/WebCore/bindings/v8/DOMDataStore.cpp 2011-07-27 02:37:03 UTC (rev 91813)
+++ trunk/Source/WebCore/bindings/v8/DOMDataStore.cpp 2011-07-27 02:41:13 UTC (rev 91814)
@@ -91,12 +91,10 @@
, m_domSvgElementInstanceMap(0)
#endif
{
- DOMDataStore::allStores().append(this);
}
DOMDataStore::~DOMDataStore()
{
- DOMDataStore::allStores().remove(DOMDataStore::allStores().find(this));
}
DOMDataList& DOMDataStore::allStores()
Modified: trunk/Source/WebCore/bindings/v8/StaticDOMDataStore.cpp (91813 => 91814)
--- trunk/Source/WebCore/bindings/v8/StaticDOMDataStore.cpp 2011-07-27 02:37:03 UTC (rev 91813)
+++ trunk/Source/WebCore/bindings/v8/StaticDOMDataStore.cpp 2011-07-27 02:41:13 UTC (rev 91814)
@@ -30,6 +30,7 @@
#include "config.h"
#include "StaticDOMDataStore.h"
+#include "V8Binding.h"
namespace WebCore {
@@ -48,6 +49,12 @@
#if ENABLE(SVG)
m_domSvgElementInstanceMap = &m_staticDomSvgElementInstanceMap;
#endif
+ V8BindingPerIsolateData::current()->registerDOMDataStore(this);
}
+StaticDOMDataStore::~StaticDOMDataStore()
+{
+ V8BindingPerIsolateData::current()->unregisterDOMDataStore(this);
+}
+
} // namespace WebCore
Modified: trunk/Source/WebCore/bindings/v8/StaticDOMDataStore.h (91813 => 91814)
--- trunk/Source/WebCore/bindings/v8/StaticDOMDataStore.h 2011-07-27 02:37:03 UTC (rev 91813)
+++ trunk/Source/WebCore/bindings/v8/StaticDOMDataStore.h 2011-07-27 02:41:13 UTC (rev 91814)
@@ -47,6 +47,7 @@
class StaticDOMDataStore : public DOMDataStore {
public:
StaticDOMDataStore();
+ virtual ~StaticDOMDataStore();
private:
IntrusiveDOMWrapperMap m_staticDomNodeMap;
Modified: trunk/Source/WebCore/bindings/v8/V8Binding.cpp (91813 => 91814)
--- trunk/Source/WebCore/bindings/v8/V8Binding.cpp 2011-07-27 02:37:03 UTC (rev 91813)
+++ trunk/Source/WebCore/bindings/v8/V8Binding.cpp 2011-07-27 02:41:13 UTC (rev 91814)
@@ -49,7 +49,7 @@
V8BindingPerIsolateData::V8BindingPerIsolateData(v8::Isolate* isolate)
- : m_DOMDataStore(0)
+ : m_domDataStore(0)
{
}
Modified: trunk/Source/WebCore/bindings/v8/V8Binding.h (91813 => 91814)
--- trunk/Source/WebCore/bindings/v8/V8Binding.h 2011-07-27 02:37:03 UTC (rev 91813)
+++ trunk/Source/WebCore/bindings/v8/V8Binding.h 2011-07-27 02:41:13 UTC (rev 91814)
@@ -109,11 +109,23 @@
v8::Persistent<v8::FunctionTemplate>& toStringTemplate() { return m_toStringTemplate; }
StringCache* stringCache() { return &m_stringCache; }
- DOMDataList& allStores() { return m_DOMDataList; }
+ DOMDataList& allStores() { return m_domDataList; }
- DOMDataStore* domDataStore() { return m_DOMDataStore; }
+ void registerDOMDataStore(DOMDataStore* domDataStore)
+ {
+ m_domDataList.append(domDataStore);
+ }
+
+ void unregisterDOMDataStore(DOMDataStore* domDataStore)
+ {
+ ASSERT(m_domDataList.find(domDataStore));
+ m_domDataList.remove(m_domDataList.find(domDataStore));
+ }
+
+
+ DOMDataStore* domDataStore() { return m_domDataStore; }
// DOMDataStore is owned outside V8BindingPerIsolateData.
- void setDOMDataStore(DOMDataStore* store) { m_DOMDataStore = store; }
+ void setDOMDataStore(DOMDataStore* store) { m_domDataStore = store; }
private:
explicit V8BindingPerIsolateData(v8::Isolate*);
@@ -125,8 +137,8 @@
v8::Persistent<v8::FunctionTemplate> m_toStringTemplate;
StringCache m_stringCache;
- DOMDataList m_DOMDataList;
- DOMDataStore* m_DOMDataStore;
+ DOMDataList m_domDataList;
+ DOMDataStore* m_domDataStore;
};
Modified: trunk/Source/WebCore/bindings/v8/V8DOMMap.cpp (91813 => 91814)
--- trunk/Source/WebCore/bindings/v8/V8DOMMap.cpp 2011-07-27 02:37:03 UTC (rev 91813)
+++ trunk/Source/WebCore/bindings/v8/V8DOMMap.cpp 2011-07-27 02:41:13 UTC (rev 91814)
@@ -34,16 +34,19 @@
#include "DOMData.h"
#include "DOMDataStore.h"
#include "ScopedDOMDataStore.h"
+#include "V8Binding.h"
namespace WebCore {
DOMDataStoreHandle::DOMDataStoreHandle()
: m_store(adoptPtr(new ScopedDOMDataStore()))
{
+ V8BindingPerIsolateData::current()->registerDOMDataStore(m_store.get());
}
DOMDataStoreHandle::~DOMDataStoreHandle()
{
+ V8BindingPerIsolateData::current()->unregisterDOMDataStore(m_store.get());
}
static inline DOMDataStore& getDOMDataStore()
Modified: trunk/Source/WebCore/bindings/v8/WorkerContextExecutionProxy.cpp (91813 => 91814)
--- trunk/Source/WebCore/bindings/v8/WorkerContextExecutionProxy.cpp 2011-07-27 02:37:03 UTC (rev 91813)
+++ trunk/Source/WebCore/bindings/v8/WorkerContextExecutionProxy.cpp 2011-07-27 02:41:13 UTC (rev 91814)
@@ -83,7 +83,7 @@
: m_workerContext(workerContext)
, m_recursion(0)
{
- initV8IfNeeded();
+ initV8();
}
WorkerContextExecutionProxy::~WorkerContextExecutionProxy()
@@ -108,13 +108,8 @@
}
}
-void WorkerContextExecutionProxy::initV8IfNeeded()
+void WorkerContextExecutionProxy::initV8()
{
- static bool v8Initialized = false;
-
- if (v8Initialized)
- return;
-
// Tell V8 not to call the default OOM handler, binding code will handle it.
v8::V8::IgnoreOutOfMemoryException();
v8::V8::SetFatalErrorHandler(reportFatalErrorInV8);
@@ -125,8 +120,6 @@
v8::SetResourceConstraints(&resource_constraints);
V8BindingPerIsolateData::ensureInitialized(v8::Isolate::GetCurrent());
-
- v8Initialized = true;
}
bool WorkerContextExecutionProxy::initContextIfNeeded()
Modified: trunk/Source/WebCore/bindings/v8/WorkerContextExecutionProxy.h (91813 => 91814)
--- trunk/Source/WebCore/bindings/v8/WorkerContextExecutionProxy.h 2011-07-27 02:37:03 UTC (rev 91813)
+++ trunk/Source/WebCore/bindings/v8/WorkerContextExecutionProxy.h 2011-07-27 02:41:13 UTC (rev 91814)
@@ -73,7 +73,7 @@
v8::Local<v8::Context> context() { return v8::Local<v8::Context>::New(m_context); }
private:
- void initV8IfNeeded();
+ void initV8();
bool initContextIfNeeded();
void dispose();
Modified: trunk/Source/WebCore/bindings/v8/WorkerScriptController.cpp (91813 => 91814)
--- trunk/Source/WebCore/bindings/v8/WorkerScriptController.cpp 2011-07-27 02:37:03 UTC (rev 91813)
+++ trunk/Source/WebCore/bindings/v8/WorkerScriptController.cpp 2011-07-27 02:41:13 UTC (rev 91814)
@@ -51,14 +51,23 @@
WorkerScriptController::WorkerScriptController(WorkerContext* workerContext)
: m_workerContext(workerContext)
- , m_proxy(adoptPtr(new WorkerContextExecutionProxy(workerContext)))
+ , m_isolate(v8::Isolate::New())
, m_executionForbidden(false)
{
+ V8BindingPerIsolateData* data = ""
+ data->allStores().append(&m_DOMDataStore);
+ data->setDOMDataStore(&m_DOMDataStore);
+ m_isolate->Enter();
+ m_proxy = adoptPtr(new WorkerContextExecutionProxy(workerContext));
}
WorkerScriptController::~WorkerScriptController()
{
removeAllDOMObjects();
+ m_proxy.clear();
+ m_isolate->Exit();
+ V8BindingPerIsolateData::dispose(m_isolate);
+ m_isolate->Dispose();
}
ScriptValue WorkerScriptController::evaluate(const ScriptSourceCode& sourceCode)
Modified: trunk/Source/WebCore/bindings/v8/WorkerScriptController.h (91813 => 91814)
--- trunk/Source/WebCore/bindings/v8/WorkerScriptController.h 2011-07-27 02:37:03 UTC (rev 91813)
+++ trunk/Source/WebCore/bindings/v8/WorkerScriptController.h 2011-07-27 02:41:13 UTC (rev 91814)
@@ -33,6 +33,10 @@
#if ENABLE(WORKERS)
+#include "ScopedDOMDataStore.h"
+#include "V8Binding.h"
+
+#include <v8.h>
#include <wtf/OwnPtr.h>
#include <wtf/Threading.h>
@@ -74,6 +78,8 @@
private:
WorkerContext* m_workerContext;
OwnPtr<WorkerContextExecutionProxy> m_proxy;
+ v8::Isolate* m_isolate;
+ ScopedDOMDataStore m_DOMDataStore;
bool m_executionForbidden;
};