Changeset 91814 in webkit


Ignore:
Timestamp:
Jul 26, 2011 7:41:13 PM (13 years ago)
Author:
dslomov@google.com
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:
Location:
trunk/Source/WebCore
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r91812 r91814  
     12011-07-26  Dmitry Lomov  <dslomov@google.com>
     2
     3        [V8][Chromium] Run workers in a separate v8::Isolate
     4        https://bugs.webkit.org/show_bug.cgi?id=65004
     5        This patch allocates a new v8::Isolate for every worker and enters it on worker thread.
     6
     7        Reviewed by David Levin.
     8
     9        Covered by existing chromium tests.
     10
     11        * bindings/v8/DOMDataStore.cpp:
     12        (WebCore::DOMDataStore::DOMDataStore):
     13        (WebCore::DOMDataStore::~DOMDataStore):
     14        * bindings/v8/StaticDOMDataStore.cpp:
     15        (WebCore::StaticDOMDataStore::StaticDOMDataStore):
     16        (WebCore::StaticDOMDataStore::~StaticDOMDataStore):
     17        * bindings/v8/StaticDOMDataStore.h:
     18        * bindings/v8/V8Binding.h:
     19        (WebCore::V8BindingPerIsolateData::registerDOMDataStore):
     20        (WebCore::V8BindingPerIsolateData::unregisterDOMDataStore):
     21        * bindings/v8/V8DOMMap.cpp:
     22        (WebCore::DOMDataStoreHandle::DOMDataStoreHandle):
     23        (WebCore::DOMDataStoreHandle::~DOMDataStoreHandle):
     24        * bindings/v8/WorkerContextExecutionProxy.cpp:
     25        (WebCore::WorkerContextExecutionProxy::WorkerContextExecutionProxy):
     26        (WebCore::WorkerContextExecutionProxy::initV8):
     27        * bindings/v8/WorkerContextExecutionProxy.h:
     28        * bindings/v8/WorkerScriptController.cpp:
     29        (WebCore::WorkerScriptController::WorkerScriptController):
     30        (WebCore::WorkerScriptController::~WorkerScriptController):
     31        * bindings/v8/WorkerScriptController.h:
     32
    1332011-07-26  James Robinson  <jamesr@chromium.org>
    234
  • trunk/Source/WebCore/bindings/v8/DOMDataStore.cpp

    r91641 r91814  
    9292#endif
    9393{
    94     DOMDataStore::allStores().append(this);
    9594}
    9695
    9796DOMDataStore::~DOMDataStore()
    9897{
    99     DOMDataStore::allStores().remove(DOMDataStore::allStores().find(this));
    10098}
    10199
  • trunk/Source/WebCore/bindings/v8/StaticDOMDataStore.cpp

    r90931 r91814  
    3131#include "config.h"
    3232#include "StaticDOMDataStore.h"
     33#include "V8Binding.h"
    3334
    3435namespace WebCore {
     
    4950    m_domSvgElementInstanceMap = &m_staticDomSvgElementInstanceMap;
    5051#endif
     52    V8BindingPerIsolateData::current()->registerDOMDataStore(this);
     53}
     54
     55StaticDOMDataStore::~StaticDOMDataStore()
     56{
     57    V8BindingPerIsolateData::current()->unregisterDOMDataStore(this);
    5158}
    5259
  • trunk/Source/WebCore/bindings/v8/StaticDOMDataStore.h

    r90931 r91814  
    4848public:
    4949    StaticDOMDataStore();
     50    virtual ~StaticDOMDataStore();
    5051
    5152private:
  • trunk/Source/WebCore/bindings/v8/V8Binding.cpp

    r91641 r91814  
    5050
    5151V8BindingPerIsolateData::V8BindingPerIsolateData(v8::Isolate* isolate)
    52     : m_DOMDataStore(0)
     52    : m_domDataStore(0)
    5353{
    5454}
  • trunk/Source/WebCore/bindings/v8/V8Binding.h

    r91300 r91814  
    110110        StringCache* stringCache() { return &m_stringCache; }
    111111
    112         DOMDataList& allStores() { return m_DOMDataList; }
    113 
    114         DOMDataStore* domDataStore() { return m_DOMDataStore; }
     112        DOMDataList& allStores() { return m_domDataList; }
     113
     114        void registerDOMDataStore(DOMDataStore* domDataStore)
     115        {
     116            m_domDataList.append(domDataStore);
     117        }
     118
     119        void unregisterDOMDataStore(DOMDataStore* domDataStore)
     120        {
     121            ASSERT(m_domDataList.find(domDataStore));
     122            m_domDataList.remove(m_domDataList.find(domDataStore));
     123        }
     124
     125
     126        DOMDataStore* domDataStore() { return m_domDataStore; }
    115127        // DOMDataStore is owned outside V8BindingPerIsolateData.
    116         void setDOMDataStore(DOMDataStore* store) { m_DOMDataStore = store; }
     128        void setDOMDataStore(DOMDataStore* store) { m_domDataStore = store; }
    117129
    118130    private:
     
    126138        StringCache m_stringCache;
    127139
    128         DOMDataList m_DOMDataList;
    129         DOMDataStore* m_DOMDataStore;
     140        DOMDataList m_domDataList;
     141        DOMDataStore* m_domDataStore;
    130142    };
    131143
  • trunk/Source/WebCore/bindings/v8/V8DOMMap.cpp

    r91641 r91814  
    3535#include "DOMDataStore.h"
    3636#include "ScopedDOMDataStore.h"
     37#include "V8Binding.h"
    3738
    3839namespace WebCore {
     
    4142    : m_store(adoptPtr(new ScopedDOMDataStore()))
    4243{
     44    V8BindingPerIsolateData::current()->registerDOMDataStore(m_store.get());
    4345}
    4446
    4547DOMDataStoreHandle::~DOMDataStoreHandle()
    4648{
     49    V8BindingPerIsolateData::current()->unregisterDOMDataStore(m_store.get());
    4750}
    4851
  • trunk/Source/WebCore/bindings/v8/WorkerContextExecutionProxy.cpp

    r89390 r91814  
    8484    , m_recursion(0)
    8585{
    86     initV8IfNeeded();
     86    initV8();
    8787}
    8888
     
    109109}
    110110
    111 void WorkerContextExecutionProxy::initV8IfNeeded()
    112 {
    113     static bool v8Initialized = false;
    114 
    115     if (v8Initialized)
    116         return;
    117 
     111void WorkerContextExecutionProxy::initV8()
     112{
    118113    // Tell V8 not to call the default OOM handler, binding code will handle it.
    119114    v8::V8::IgnoreOutOfMemoryException();
     
    126121
    127122    V8BindingPerIsolateData::ensureInitialized(v8::Isolate::GetCurrent());
    128 
    129     v8Initialized = true;
    130123}
    131124
  • trunk/Source/WebCore/bindings/v8/WorkerContextExecutionProxy.h

    r71735 r91814  
    7474
    7575    private:
    76         void initV8IfNeeded();
     76        void initV8();
    7777        bool initContextIfNeeded();
    7878        void dispose();
  • trunk/Source/WebCore/bindings/v8/WorkerScriptController.cpp

    r88357 r91814  
    5252WorkerScriptController::WorkerScriptController(WorkerContext* workerContext)
    5353    : m_workerContext(workerContext)
    54     , m_proxy(adoptPtr(new WorkerContextExecutionProxy(workerContext)))
     54    , m_isolate(v8::Isolate::New())
    5555    , m_executionForbidden(false)
    5656{
     57    V8BindingPerIsolateData* data = V8BindingPerIsolateData::create(m_isolate);
     58    data->allStores().append(&m_DOMDataStore);
     59    data->setDOMDataStore(&m_DOMDataStore);
     60    m_isolate->Enter();
     61    m_proxy = adoptPtr(new WorkerContextExecutionProxy(workerContext));
    5762}
    5863
     
    6065{
    6166    removeAllDOMObjects();
     67    m_proxy.clear();
     68    m_isolate->Exit();
     69    V8BindingPerIsolateData::dispose(m_isolate);
     70    m_isolate->Dispose();
    6271}
    6372
  • trunk/Source/WebCore/bindings/v8/WorkerScriptController.h

    r83900 r91814  
    3434#if ENABLE(WORKERS)
    3535
     36#include "ScopedDOMDataStore.h"
     37#include "V8Binding.h"
     38
     39#include <v8.h>
    3640#include <wtf/OwnPtr.h>
    3741#include <wtf/Threading.h>
     
    7579        WorkerContext* m_workerContext;
    7680        OwnPtr<WorkerContextExecutionProxy> m_proxy;
     81        v8::Isolate* m_isolate;
     82        ScopedDOMDataStore m_DOMDataStore;
    7783        bool m_executionForbidden;
    7884    };
Note: See TracChangeset for help on using the changeset viewer.