diff options
Diffstat (limited to 'Source/JavaScriptCore/runtime/JSLock.cpp')
-rw-r--r-- | Source/JavaScriptCore/runtime/JSLock.cpp | 54 |
1 files changed, 34 insertions, 20 deletions
diff --git a/Source/JavaScriptCore/runtime/JSLock.cpp b/Source/JavaScriptCore/runtime/JSLock.cpp index 5e3d12c92..4baa2a603 100644 --- a/Source/JavaScriptCore/runtime/JSLock.cpp +++ b/Source/JavaScriptCore/runtime/JSLock.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2005, 2008, 2012 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -25,7 +25,7 @@ #include "CallFrame.h" #include "JSGlobalObject.h" #include "JSObject.h" - +#include "Operations.h" #if USE(PTHREADS) #include <pthread.h> @@ -51,32 +51,40 @@ void GlobalJSLock::initialize() } JSLockHolder::JSLockHolder(ExecState* exec) - : m_globalData(&exec->globalData()) + : m_vm(&exec->vm()) +{ + init(); +} + +JSLockHolder::JSLockHolder(VM* vm) + : m_vm(vm) { - m_globalData->apiLock().lock(); + init(); } -JSLockHolder::JSLockHolder(JSGlobalData* globalData) - : m_globalData(globalData) +JSLockHolder::JSLockHolder(VM& vm) + : m_vm(&vm) { - m_globalData->apiLock().lock(); + init(); } -JSLockHolder::JSLockHolder(JSGlobalData& globalData) - : m_globalData(&globalData) +void JSLockHolder::init() { - m_globalData->apiLock().lock(); + m_vm->apiLock().lock(); } JSLockHolder::~JSLockHolder() { - m_globalData->apiLock().unlock(); + RefPtr<JSLock> apiLock(&m_vm->apiLock()); + m_vm.clear(); + apiLock->unlock(); } -JSLock::JSLock() +JSLock::JSLock(VM* vm) : m_ownerThread(0) , m_lockCount(0) , m_lockDropDepth(0) + , m_vm(vm) { m_spinLock.Init(); } @@ -85,6 +93,12 @@ JSLock::~JSLock() { } +void JSLock::willDestroyVM(VM* vm) +{ + ASSERT_UNUSED(vm, m_vm == vm); + m_vm = 0; +} + void JSLock::lock() { ThreadIdentifier currentThread = WTF::currentThread(); @@ -119,12 +133,12 @@ void JSLock::unlock() void JSLock::lock(ExecState* exec) { - exec->globalData().apiLock().lock(); + exec->vm().apiLock().lock(); } void JSLock::unlock(ExecState* exec) { - exec->globalData().apiLock().unlock(); + exec->vm().apiLock().unlock(); } bool JSLock::currentThreadIsHoldingLock() @@ -201,21 +215,21 @@ void JSLock::grabAllLocks(unsigned lockCount) JSLock::DropAllLocks::DropAllLocks(ExecState* exec) : m_lockCount(0) - , m_globalData(&exec->globalData()) + , m_vm(&exec->vm()) { - m_lockCount = m_globalData->apiLock().dropAllLocks(); + m_lockCount = m_vm->apiLock().dropAllLocks(); } -JSLock::DropAllLocks::DropAllLocks(JSGlobalData* globalData) +JSLock::DropAllLocks::DropAllLocks(VM* vm) : m_lockCount(0) - , m_globalData(globalData) + , m_vm(vm) { - m_lockCount = m_globalData->apiLock().dropAllLocks(); + m_lockCount = m_vm->apiLock().dropAllLocks(); } JSLock::DropAllLocks::~DropAllLocks() { - m_globalData->apiLock().grabAllLocks(m_lockCount); + m_vm->apiLock().grabAllLocks(m_lockCount); } } // namespace JSC |