Title: [91814] trunk/Source/WebCore
Revision
91814
Author
[email protected]
Date
2011-07-26 19:41:13 -0700 (Tue, 26 Jul 2011)

Log Message

[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:

Modified Paths

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;
     };
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to