summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrei Popescu <andreip@google.com>2009-08-04 15:23:24 +0100
committerAndrei Popescu <andreip@google.com>2009-08-05 20:11:54 +0100
commit14be0af3dbf46bfc174c0081053eccccef89edc7 (patch)
tree02ae286cd26ecd31c1e7b0e8b6674c36e8eca8c3
parente65a5905dd4459ab5e4ef22d6dcb85e1d1a0b7cb (diff)
downloadexternal_webkit-14be0af3dbf46bfc174c0081053eccccef89edc7.zip
external_webkit-14be0af3dbf46bfc174c0081053eccccef89edc7.tar.gz
external_webkit-14be0af3dbf46bfc174c0081053eccccef89edc7.tar.bz2
Add V8 locks at the v8 entry points for use with workers.
-rw-r--r--V8Binding/binding/NPV8Object.cpp23
-rw-r--r--V8Binding/binding/V8NPObject.cpp1
-rw-r--r--V8Binding/binding/v8_proxy.cpp8
-rw-r--r--WebCore/bindings/v8/ScheduledAction.cpp2
-rw-r--r--WebCore/bindings/v8/ScriptController.cpp3
-rw-r--r--WebCore/bindings/v8/V8AbstractEventListener.cpp1
-rw-r--r--WebCore/bindings/v8/V8Utilities.h5
-rw-r--r--WebCore/bindings/v8/V8WorkerContextEventListener.cpp2
-rw-r--r--WebCore/bindings/v8/WorkerContextExecutionProxy.cpp7
-rw-r--r--WebCore/config.h2
10 files changed, 52 insertions, 2 deletions
diff --git a/V8Binding/binding/NPV8Object.cpp b/V8Binding/binding/NPV8Object.cpp
index 6dccae1..d856a43 100644
--- a/V8Binding/binding/NPV8Object.cpp
+++ b/V8Binding/binding/NPV8Object.cpp
@@ -125,6 +125,8 @@ bool NPN_Invoke(NPP npp, NPObject *npobj, NPIdentifier methodName,
if (!npobj)
return false;
+ LOCK_V8;
+
if (npobj->_class == npScriptObjectClass) {
V8NPObject *object = reinterpret_cast<V8NPObject*>(npobj);
@@ -195,6 +197,8 @@ bool NPN_InvokeDefault(NPP npp, NPObject *npobj, const NPVariant *args,
if (!npobj)
return false;
+ LOCK_V8;
+
if (npobj->_class == npScriptObjectClass) {
V8NPObject *object = reinterpret_cast<V8NPObject*>(npobj);
@@ -255,6 +259,8 @@ bool NPN_EvaluateHelper(NPP npp, bool popupsAllowed, NPObject* npobj, NPString*
if (npobj->_class != npScriptObjectClass)
return false;
+ LOCK_V8;
+
v8::HandleScope handleScope;
v8::Handle<v8::Context> context = getV8Context(npp, npobj);
if (context.IsEmpty())
@@ -298,6 +304,8 @@ bool NPN_GetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName, NPVari
if (!npobj)
return false;
+ LOCK_V8;
+
if (npobj->_class == npScriptObjectClass) {
V8NPObject *object = reinterpret_cast<V8NPObject*>(npobj);
@@ -329,6 +337,8 @@ bool NPN_SetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName, const
if (!npobj)
return false;
+ LOCK_V8;
+
if (npobj->_class == npScriptObjectClass) {
V8NPObject *object = reinterpret_cast<V8NPObject*>(npobj);
@@ -358,6 +368,8 @@ bool NPN_RemoveProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName)
if (npobj->_class != npScriptObjectClass)
return false;
+ LOCK_V8;
+
V8NPObject *object = reinterpret_cast<V8NPObject*>(npobj);
v8::HandleScope handleScope;
@@ -377,6 +389,8 @@ bool NPN_HasProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName)
if (!npobj)
return false;
+ LOCK_V8;
+
if (npobj->_class == npScriptObjectClass) {
V8NPObject *object = reinterpret_cast<V8NPObject*>(npobj);
@@ -400,6 +414,8 @@ bool NPN_HasMethod(NPP npp, NPObject *npobj, NPIdentifier methodName)
if (!npobj)
return false;
+ LOCK_V8;
+
if (npobj->_class == npScriptObjectClass) {
V8NPObject *object = reinterpret_cast<V8NPObject*>(npobj);
@@ -423,6 +439,9 @@ void NPN_SetException(NPObject *npobj, const NPUTF8 *message)
{
if (npobj->_class != npScriptObjectClass)
return;
+
+ LOCK_V8;
+
v8::HandleScope handleScope;
v8::Handle<v8::Context> context = getV8Context(0, npobj);
if (context.IsEmpty())
@@ -437,6 +456,8 @@ bool NPN_Enumerate(NPP npp, NPObject *npobj, NPIdentifier **identifier, uint32_t
if (!npobj)
return false;
+ LOCK_V8;
+
if (npobj->_class == npScriptObjectClass) {
V8NPObject *object = reinterpret_cast<V8NPObject*>(npobj);
@@ -493,6 +514,8 @@ bool NPN_Construct(NPP npp, NPObject* npobj, const NPVariant* args, uint32_t arg
if (!npobj)
return false;
+ LOCK_V8;
+
if (npobj->_class == npScriptObjectClass) {
V8NPObject *object = reinterpret_cast<V8NPObject*>(npobj);
diff --git a/V8Binding/binding/V8NPObject.cpp b/V8Binding/binding/V8NPObject.cpp
index 8d3a518..dd9af69 100644
--- a/V8Binding/binding/V8NPObject.cpp
+++ b/V8Binding/binding/V8NPObject.cpp
@@ -363,6 +363,7 @@ v8::Local<v8::Object> createV8ObjectForNPObject(NPObject* object, NPObject* root
void forgetV8ObjectForNPObject(NPObject* object)
{
if (staticNPObjectMap.contains(object)) {
+ LOCK_V8;
v8::HandleScope scope;
v8::Persistent<v8::Object> handle(staticNPObjectMap.get(object));
WebCore::V8Proxy::SetDOMWrapper(handle, WebCore::V8ClassIndex::NPOBJECT, 0);
diff --git a/V8Binding/binding/v8_proxy.cpp b/V8Binding/binding/v8_proxy.cpp
index d8d6b66..37e3dbb 100644
--- a/V8Binding/binding/v8_proxy.cpp
+++ b/V8Binding/binding/v8_proxy.cpp
@@ -1078,7 +1078,7 @@ void V8Proxy::evaluateInNewContext(const Vector<ScriptSourceCode>& sources)
v8::Local<v8::Value> V8Proxy::evaluate(const ScriptSourceCode& source, Node* n)
{
ASSERT(v8::Context::InContext());
-
+ LOCK_V8;
// Compile the script.
v8::Local<v8::String> code = v8ExternalString(source.source());
#if PLATFORM(CHROMIUM)
@@ -1905,6 +1905,7 @@ void V8Proxy::ClearDocumentWrapper()
void V8Proxy::UpdateDocumentWrapperCache()
{
+ LOCK_V8;
v8::HandleScope handle_scope;
v8::Context::Scope context_scope(GetContext());
v8::Handle<v8::Value> document_wrapper = NodeToV8Object(m_frame->document());
@@ -1947,6 +1948,7 @@ void V8Proxy::DisposeContextHandles() {
void V8Proxy::clearForClose()
{
if (!m_context.IsEmpty()) {
+ LOCK_V8;
v8::HandleScope handle_scope;
ClearDocumentWrapper();
@@ -1961,6 +1963,7 @@ void V8Proxy::clearForNavigation()
DisconnectEventListeners();
if (!m_context.IsEmpty()) {
+ LOCK_V8;
v8::HandleScope handle;
ClearDocumentWrapper();
@@ -2039,6 +2042,7 @@ void V8Proxy::updateDocument()
void V8Proxy::updateSecurityOrigin()
{
+ LOCK_V8;
v8::HandleScope scope;
SetSecurityToken();
}
@@ -2216,7 +2220,7 @@ void V8Proxy::InitContextIfNeeded()
#ifdef ANDROID_INSTRUMENT
android::TimeCounter::start(android::TimeCounter::JavaScriptInitTimeCounter);
#endif
-
+ LOCK_V8;
// Create a handle scope for all local handles.
v8::HandleScope handle_scope;
diff --git a/WebCore/bindings/v8/ScheduledAction.cpp b/WebCore/bindings/v8/ScheduledAction.cpp
index ab51600..b1db8cf 100644
--- a/WebCore/bindings/v8/ScheduledAction.cpp
+++ b/WebCore/bindings/v8/ScheduledAction.cpp
@@ -105,6 +105,7 @@ void ScheduledAction::execute(V8Proxy* proxy)
{
ASSERT(proxy);
+ LOCK_V8;
v8::HandleScope handleScope;
v8::Local<v8::Context> v8Context = proxy->GetContext();
if (v8Context.IsEmpty())
@@ -133,6 +134,7 @@ void ScheduledAction::execute(WorkerContext* workerContext)
WorkerScriptController* scriptController = workerContext->script();
if (!m_function.IsEmpty() && m_function->IsFunction()) {
+ LOCK_V8;
v8::HandleScope handleScope;
v8::Local<v8::Context> v8Context = scriptController->proxy()->GetContext();
ASSERT(!v8Context.IsEmpty());
diff --git a/WebCore/bindings/v8/ScriptController.cpp b/WebCore/bindings/v8/ScriptController.cpp
index 833c99f..97bb8ec 100644
--- a/WebCore/bindings/v8/ScriptController.cpp
+++ b/WebCore/bindings/v8/ScriptController.cpp
@@ -191,6 +191,7 @@ void ScriptController::evaluateInNewContext(const Vector<ScriptSourceCode>& sour
// Evaluate a script file in the environment of this proxy.
ScriptValue ScriptController::evaluate(const ScriptSourceCode& sourceCode)
{
+ LOCK_V8;
v8::HandleScope handleScope;
v8::Handle<v8::Context> context = V8Proxy::GetContext(m_proxy->frame());
if (context.IsEmpty())
@@ -225,6 +226,7 @@ void ScriptController::finishedWithEvent(Event* event)
// Create a V8 object with an interceptor of NPObjectPropertyGetter.
void ScriptController::bindToWindowObject(Frame* frame, const String& key, NPObject* object)
{
+ LOCK_V8;
v8::HandleScope handleScope;
v8::Handle<v8::Context> context = V8Proxy::GetContext(frame);
@@ -371,6 +373,7 @@ NPObject* ScriptController::createScriptObjectForPluginElement(HTMLPlugInElement
if (!isEnabled())
return createNoScriptObject();
+ LOCK_V8;
v8::HandleScope handleScope;
v8::Handle<v8::Context> context = V8Proxy::GetContext(m_frame);
if (context.IsEmpty())
diff --git a/WebCore/bindings/v8/V8AbstractEventListener.cpp b/WebCore/bindings/v8/V8AbstractEventListener.cpp
index 462a729..07e944d 100644
--- a/WebCore/bindings/v8/V8AbstractEventListener.cpp
+++ b/WebCore/bindings/v8/V8AbstractEventListener.cpp
@@ -110,6 +110,7 @@ void V8AbstractEventListener::handleEvent(Event* event, bool isWindowEvent)
// See issue 889829.
RefPtr<V8AbstractEventListener> protect(this);
+ LOCK_V8;
v8::HandleScope handleScope;
v8::Handle<v8::Context> context = V8Proxy::GetContext(m_frame);
diff --git a/WebCore/bindings/v8/V8Utilities.h b/WebCore/bindings/v8/V8Utilities.h
index 5769910..fdabc7a 100644
--- a/WebCore/bindings/v8/V8Utilities.h
+++ b/WebCore/bindings/v8/V8Utilities.h
@@ -33,6 +33,11 @@
// FIXME: Remove once chromium dependencies on v8_utility.h are removed.
#define V8UTILITIES_DEFINED 1
+#if ENABLE(V8_LOCKERS)
+#define LOCK_V8 v8::Locker lock
+#else
+#define LOCK_V8 ((void) 0)
+#endif
#include <v8.h>
diff --git a/WebCore/bindings/v8/V8WorkerContextEventListener.cpp b/WebCore/bindings/v8/V8WorkerContextEventListener.cpp
index 9bb48fb..a21d3eb 100644
--- a/WebCore/bindings/v8/V8WorkerContextEventListener.cpp
+++ b/WebCore/bindings/v8/V8WorkerContextEventListener.cpp
@@ -35,6 +35,7 @@
#include "V8WorkerContextEventListener.h"
#include "Event.h"
+#include "V8Utilities.h"
#include "WorkerContextExecutionProxy.h"
namespace WebCore {
@@ -62,6 +63,7 @@ void V8WorkerContextEventListener::handleEvent(Event* event, bool isWindowEvent)
// See issue 889829.
RefPtr<V8AbstractEventListener> protect(this);
+ LOCK_V8;
v8::HandleScope handleScope;
v8::Handle<v8::Context> context = m_proxy->GetContext();
diff --git a/WebCore/bindings/v8/WorkerContextExecutionProxy.cpp b/WebCore/bindings/v8/WorkerContextExecutionProxy.cpp
index 7af9536..c87cdea 100644
--- a/WebCore/bindings/v8/WorkerContextExecutionProxy.cpp
+++ b/WebCore/bindings/v8/WorkerContextExecutionProxy.cpp
@@ -141,6 +141,7 @@ void WorkerContextExecutionProxy::initV8IfNeeded()
{
static bool v8Initialized = false;
+ LOCK_V8;
if (v8Initialized)
return;
@@ -151,6 +152,10 @@ void WorkerContextExecutionProxy::initV8IfNeeded()
// Set up the handler for V8 error message.
v8::V8::AddMessageListener(handleConsoleMessage);
+#if PLATFORM(ANDROID)
+ const int workerThreadPreemptionIntervalMs = 5;
+ v8::Locker::StartPreemption(workerThreadPreemptionIntervalMs);
+#endif
v8Initialized = true;
}
@@ -337,6 +342,7 @@ bool WorkerContextExecutionProxy::forgetV8EventObject(Event* event)
v8::Local<v8::Value> WorkerContextExecutionProxy::evaluate(const String& script, const String& fileName, int baseLine)
{
+ LOCK_V8;
v8::HandleScope hs;
initContextIfNeeded();
@@ -394,6 +400,7 @@ PassRefPtr<V8EventListener> WorkerContextExecutionProxy::findOrCreateEventListen
newListener = V8WorkerContextObjectEventListener::create(this, v8::Local<v8::Object>::Cast(object), isInline);
else
newListener = V8WorkerContextEventListener::create(this, v8::Local<v8::Object>::Cast(object), isInline);
+
m_listeners->add(newListener.get());
return newListener.release();
diff --git a/WebCore/config.h b/WebCore/config.h
index 24a4e6a..c921d68 100644
--- a/WebCore/config.h
+++ b/WebCore/config.h
@@ -105,6 +105,8 @@
#define ENABLE_SVG 0
#undef ENABLE_WORKERS
#define ENABLE_WORKERS 1
+#undef ENABLE_V8_LOCKERS
+#define ENABLE_V8_LOCKERS 1
#endif
#if ENABLE_SVG
#if !defined(ENABLE_SVG_ANIMATION)