| Index: third_party/WebKit/WebCore/bindings/js/WorkerScriptController.cpp
 | 
| ===================================================================
 | 
| --- third_party/WebKit/WebCore/bindings/js/WorkerScriptController.cpp	(revision 9391)
 | 
| +++ third_party/WebKit/WebCore/bindings/js/WorkerScriptController.cpp	(working copy)
 | 
| @@ -1,118 +1,118 @@
 | 
| -/*
 | 
| - * Copyright (C) 2008 Apple Inc. All Rights Reserved.
 | 
| - *
 | 
| - * Redistribution and use in source and binary forms, with or without
 | 
| - * modification, are permitted provided that the following conditions
 | 
| - * are met:
 | 
| - * 1. Redistributions of source code must retain the above copyright
 | 
| - *    notice, this list of conditions and the following disclaimer.
 | 
| - * 2. Redistributions in binary form must reproduce the above copyright
 | 
| - *    notice, this list of conditions and the following disclaimer in the
 | 
| - *    documentation and/or other materials provided with the distribution.
 | 
| - *
 | 
| - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
 | 
| - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
| - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 | 
| - * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
 | 
| - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 | 
| - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 | 
| - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 | 
| - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 | 
| - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
| - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
| - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 | 
| - *
 | 
| - */
 | 
| -
 | 
| -#include "config.h"
 | 
| -
 | 
| -#if ENABLE(WORKERS)
 | 
| -
 | 
| -#include "WorkerScriptController.h"
 | 
| -
 | 
| -#include "JSDOMBinding.h"
 | 
| -#include "JSWorkerContext.h"
 | 
| -#include "ScriptSourceCode.h"
 | 
| -#include "ScriptValue.h"
 | 
| -#include "WorkerContext.h"
 | 
| -#include "WorkerMessagingProxy.h"
 | 
| -#include "WorkerThread.h"
 | 
| -#include <interpreter/Interpreter.h>
 | 
| -#include <runtime/Completion.h>
 | 
| -#include <runtime/Completion.h>
 | 
| -#include <runtime/JSLock.h>
 | 
| -
 | 
| -using namespace JSC;
 | 
| -
 | 
| -namespace WebCore {
 | 
| -
 | 
| -WorkerScriptController::WorkerScriptController(WorkerContext* workerContext)
 | 
| -    : m_globalData(JSGlobalData::create())
 | 
| -    , m_workerContext(workerContext)
 | 
| -    , m_executionForbidden(false)
 | 
| -{
 | 
| -}
 | 
| -
 | 
| -WorkerScriptController::~WorkerScriptController()
 | 
| -{
 | 
| -    m_workerContextWrapper = 0; // Unprotect the global object.
 | 
| -
 | 
| -    ASSERT(!m_globalData->heap.protectedObjectCount());
 | 
| -    ASSERT(!m_globalData->heap.isBusy());
 | 
| -    m_globalData->heap.destroy();
 | 
| -}
 | 
| -
 | 
| -void WorkerScriptController::initScript()
 | 
| -{
 | 
| -    ASSERT(!m_workerContextWrapper);
 | 
| -
 | 
| -    JSLock lock(false);
 | 
| -
 | 
| -    RefPtr<Structure> prototypeStructure = JSWorkerContextPrototype::createStructure(jsNull());
 | 
| -    RefPtr<Structure> structure = JSWorkerContext::createStructure(new (m_globalData.get()) JSWorkerContextPrototype(prototypeStructure.release()));
 | 
| -    m_workerContextWrapper = new (m_globalData.get()) JSWorkerContext(structure.release(), m_workerContext);
 | 
| -}
 | 
| -
 | 
| -ScriptValue WorkerScriptController::evaluate(const ScriptSourceCode& sourceCode)
 | 
| -{
 | 
| -    {
 | 
| -        MutexLocker lock(m_sharedDataMutex);
 | 
| -        if (m_executionForbidden)
 | 
| -            return noValue();
 | 
| -    }
 | 
| -
 | 
| -    initScriptIfNeeded();
 | 
| -    JSLock lock(false);
 | 
| -
 | 
| -    ExecState* exec = m_workerContextWrapper->globalExec();
 | 
| -    m_workerContextWrapper->startTimeoutCheck();
 | 
| -    Completion comp = JSC::evaluate(exec, exec->dynamicGlobalObject()->globalScopeChain(), sourceCode.jsSourceCode(), m_workerContextWrapper);
 | 
| -    m_workerContextWrapper->stopTimeoutCheck();
 | 
| -
 | 
| -    m_workerContext->thread()->messagingProxy()->reportWorkerThreadActivity(m_workerContext->hasPendingActivity());
 | 
| -
 | 
| -    if (comp.complType() == Normal || comp.complType() == ReturnValue)
 | 
| -        return comp.value();
 | 
| -
 | 
| -    if (comp.complType() == Throw)
 | 
| -        reportException(exec, comp.value());
 | 
| -    return noValue();
 | 
| -}
 | 
| -
 | 
| -void WorkerScriptController::forbidExecution()
 | 
| -{
 | 
| -    // This function is called from another thread.
 | 
| -    // Mutex protection for m_executionForbidden is needed to guarantee that the value is synchronized between processors, because
 | 
| -    // if it were not, the worker could re-enter JSC::evaluate(), but with timeout already reset.
 | 
| -    // It is not critical for Interpreter::m_timeoutTime to be synchronized, we just rely on it reaching the worker thread's processor sooner or later.
 | 
| -    MutexLocker lock(m_sharedDataMutex);
 | 
| -    m_executionForbidden = true;
 | 
| -    m_globalData->interpreter->setTimeoutTime(1); // 1 ms is the smallest timeout that can be set.
 | 
| -}
 | 
| -
 | 
| -} // namespace WebCore
 | 
| -
 | 
| -#endif // ENABLE(WORKERS)
 | 
| -
 | 
| -
 | 
| -
 | 
| +/*
 | 
| + * Copyright (C) 2008 Apple Inc. All Rights Reserved.
 | 
| + *
 | 
| + * Redistribution and use in source and binary forms, with or without
 | 
| + * modification, are permitted provided that the following conditions
 | 
| + * are met:
 | 
| + * 1. Redistributions of source code must retain the above copyright
 | 
| + *    notice, this list of conditions and the following disclaimer.
 | 
| + * 2. Redistributions in binary form must reproduce the above copyright
 | 
| + *    notice, this list of conditions and the following disclaimer in the
 | 
| + *    documentation and/or other materials provided with the distribution.
 | 
| + *
 | 
| + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
 | 
| + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
| + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 | 
| + * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
 | 
| + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 | 
| + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 | 
| + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 | 
| + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 | 
| + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
| + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
| + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 | 
| + *
 | 
| + */
 | 
| +
 | 
| +#include "config.h"
 | 
| +
 | 
| +#if ENABLE(WORKERS)
 | 
| +
 | 
| +#include "WorkerScriptController.h"
 | 
| +
 | 
| +#include "JSDOMBinding.h"
 | 
| +#include "JSWorkerContext.h"
 | 
| +#include "ScriptSourceCode.h"
 | 
| +#include "ScriptValue.h"
 | 
| +#include "WorkerContext.h"
 | 
| +#include "WorkerMessagingProxy.h"
 | 
| +#include "WorkerThread.h"
 | 
| +#include <interpreter/Interpreter.h>
 | 
| +#include <runtime/Completion.h>
 | 
| +#include <runtime/Completion.h>
 | 
| +#include <runtime/JSLock.h>
 | 
| +
 | 
| +using namespace JSC;
 | 
| +
 | 
| +namespace WebCore {
 | 
| +
 | 
| +WorkerScriptController::WorkerScriptController(WorkerContext* workerContext)
 | 
| +    : m_globalData(JSGlobalData::create())
 | 
| +    , m_workerContext(workerContext)
 | 
| +    , m_executionForbidden(false)
 | 
| +{
 | 
| +}
 | 
| +
 | 
| +WorkerScriptController::~WorkerScriptController()
 | 
| +{
 | 
| +    m_workerContextWrapper = 0; // Unprotect the global object.
 | 
| +
 | 
| +    ASSERT(!m_globalData->heap.protectedObjectCount());
 | 
| +    ASSERT(!m_globalData->heap.isBusy());
 | 
| +    m_globalData->heap.destroy();
 | 
| +}
 | 
| +
 | 
| +void WorkerScriptController::initScript()
 | 
| +{
 | 
| +    ASSERT(!m_workerContextWrapper);
 | 
| +
 | 
| +    JSLock lock(false);
 | 
| +
 | 
| +    RefPtr<Structure> prototypeStructure = JSWorkerContextPrototype::createStructure(jsNull());
 | 
| +    RefPtr<Structure> structure = JSWorkerContext::createStructure(new (m_globalData.get()) JSWorkerContextPrototype(prototypeStructure.release()));
 | 
| +    m_workerContextWrapper = new (m_globalData.get()) JSWorkerContext(structure.release(), m_workerContext);
 | 
| +}
 | 
| +
 | 
| +ScriptValue WorkerScriptController::evaluate(const ScriptSourceCode& sourceCode)
 | 
| +{
 | 
| +    {
 | 
| +        MutexLocker lock(m_sharedDataMutex);
 | 
| +        if (m_executionForbidden)
 | 
| +            return noValue();
 | 
| +    }
 | 
| +
 | 
| +    initScriptIfNeeded();
 | 
| +    JSLock lock(false);
 | 
| +
 | 
| +    ExecState* exec = m_workerContextWrapper->globalExec();
 | 
| +    m_workerContextWrapper->startTimeoutCheck();
 | 
| +    Completion comp = JSC::evaluate(exec, exec->dynamicGlobalObject()->globalScopeChain(), sourceCode.jsSourceCode(), m_workerContextWrapper);
 | 
| +    m_workerContextWrapper->stopTimeoutCheck();
 | 
| +
 | 
| +    m_workerContext->thread()->messagingProxy()->reportPendingActivity(m_workerContext->hasPendingActivity());
 | 
| +
 | 
| +    if (comp.complType() == Normal || comp.complType() == ReturnValue)
 | 
| +        return comp.value();
 | 
| +
 | 
| +    if (comp.complType() == Throw)
 | 
| +        reportException(exec, comp.value());
 | 
| +    return noValue();
 | 
| +}
 | 
| +
 | 
| +void WorkerScriptController::forbidExecution()
 | 
| +{
 | 
| +    // This function is called from another thread.
 | 
| +    // Mutex protection for m_executionForbidden is needed to guarantee that the value is synchronized between processors, because
 | 
| +    // if it were not, the worker could re-enter JSC::evaluate(), but with timeout already reset.
 | 
| +    // It is not critical for Interpreter::m_timeoutTime to be synchronized, we just rely on it reaching the worker thread's processor sooner or later.
 | 
| +    MutexLocker lock(m_sharedDataMutex);
 | 
| +    m_executionForbidden = true;
 | 
| +    m_globalData->interpreter->setTimeoutTime(1); // 1 ms is the smallest timeout that can be set.
 | 
| +}
 | 
| +
 | 
| +} // namespace WebCore
 | 
| +
 | 
| +#endif // ENABLE(WORKERS)
 | 
| +
 | 
| +
 | 
| +
 | 
| 
 |