Diff
Modified: trunk/Source/_javascript_Core/API/JSManagedValue.mm (250724 => 250725)
--- trunk/Source/_javascript_Core/API/JSManagedValue.mm 2019-10-04 15:34:06 UTC (rev 250724)
+++ trunk/Source/_javascript_Core/API/JSManagedValue.mm 2019-10-04 15:35:03 UTC (rev 250725)
@@ -147,9 +147,12 @@
- (JSValue *)value
{
- JSC::JSLockHolder locker(JSC::JSLockHolder::LockIfVMIsLive, *m_lock.get());
- if (!locker.vm())
+ WTF::Locker<JSC::JSLock> locker(m_lock.get());
+ JSC::VM* vm = m_lock->vm();
+ if (!vm)
return nil;
+
+ JSC::JSLockHolder apiLocker(vm);
if (!m_globalObject)
return nil;
if (m_weakValue.isClear())
Modified: trunk/Source/_javascript_Core/API/glib/JSCWeakValue.cpp (250724 => 250725)
--- trunk/Source/_javascript_Core/API/glib/JSCWeakValue.cpp 2019-10-04 15:34:06 UTC (rev 250724)
+++ trunk/Source/_javascript_Core/API/glib/JSCWeakValue.cpp 2019-10-04 15:35:03 UTC (rev 250725)
@@ -189,10 +189,12 @@
g_return_val_if_fail(JSC_IS_WEAK_VALUE(weakValue), nullptr);
JSCWeakValuePrivate* priv = weakValue->priv;
- JSC::JSLockHolder locker(JSC::JSLockHolder::LockIfVMIsLive, *priv->lock.get());
- if (!locker.vm())
+ WTF::Locker<JSC::JSLock> locker(priv->lock.get());
+ JSC::VM* vm = priv->lock->vm();
+ if (!vm)
return nullptr;
+ JSC::JSLockHolder apiLocker(vm);
if (!priv->globalObject || priv->weakValueRef.isClear())
return nullptr;
Modified: trunk/Source/_javascript_Core/ChangeLog (250724 => 250725)
--- trunk/Source/_javascript_Core/ChangeLog 2019-10-04 15:34:06 UTC (rev 250724)
+++ trunk/Source/_javascript_Core/ChangeLog 2019-10-04 15:35:03 UTC (rev 250725)
@@ -1,5 +1,17 @@
2019-10-04 Truitt Savell <tsav...@apple.com>
+ Unreviewed, rolling out r250583.
+
+ Broke multiple internal API tests
+
+ Reverted changeset:
+
+ "[JSC] Place VM* in TLS"
+ https://bugs.webkit.org/show_bug.cgi?id=202391
+ https://trac.webkit.org/changeset/250583
+
+2019-10-04 Truitt Savell <tsav...@apple.com>
+
Unreviewed, rolling out r250594.
Broke multiple internal API tests
Modified: trunk/Source/_javascript_Core/runtime/InitializeThreading.cpp (250724 => 250725)
--- trunk/Source/_javascript_Core/runtime/InitializeThreading.cpp 2019-10-04 15:34:06 UTC (rev 250724)
+++ trunk/Source/_javascript_Core/runtime/InitializeThreading.cpp 2019-10-04 15:35:03 UTC (rev 250725)
@@ -71,8 +71,6 @@
initializePtrTagLookup();
- VM::initializeTLS();
-
#if ENABLE(WRITE_BARRIER_PROFILING)
WriteBarrierCounters::initialize();
#endif
Modified: trunk/Source/_javascript_Core/runtime/JSLock.cpp (250724 => 250725)
--- trunk/Source/_javascript_Core/runtime/JSLock.cpp 2019-10-04 15:34:06 UTC (rev 250724)
+++ trunk/Source/_javascript_Core/runtime/JSLock.cpp 2019-10-04 15:35:03 UTC (rev 250725)
@@ -28,7 +28,6 @@
#include "JSCInlines.h"
#include "MachineStackMarker.h"
#include "SamplingProfiler.h"
-#include "VM.h"
#include "WasmCapabilities.h"
#include "WasmMachineThreads.h"
#include <thread>
@@ -68,27 +67,13 @@
: m_vm(&vm)
{
m_vm->apiLock().lock();
- m_previousVMInTLS = VM::exchange(m_vm.get());
}
-JSLockHolder::JSLockHolder(LockIfVMIsLiveTag, JSLock& lock)
-{
- lock.lock();
- if (lock.m_vm) {
- m_vm = lock.m_vm;
- m_previousVMInTLS = VM::exchange(m_vm.get());
- } else
- lock.unlock();
-}
-
JSLockHolder::~JSLockHolder()
{
- if (m_vm) {
- RefPtr<JSLock> apiLock(&m_vm->apiLock());
- m_vm = nullptr;
- apiLock->unlock();
- VM::exchange(m_previousVMInTLS); // Change VM only after unlocking. Otherwise, willReleaseLock will see previous VM.
- }
+ RefPtr<JSLock> apiLock(&m_vm->apiLock());
+ m_vm = nullptr;
+ apiLock->unlock();
}
JSLock::JSLock(VM* vm)
@@ -237,6 +222,16 @@
}
}
+void JSLock::lock(ExecState* exec)
+{
+ exec->vm().apiLock().lock();
+}
+
+void JSLock::unlock(ExecState* exec)
+{
+ exec->vm().apiLock().unlock();
+}
+
// This function returns the number of locks that were dropped.
unsigned JSLock::dropAllLocks(DropAllLocks* dropper)
{
@@ -290,8 +285,6 @@
return;
RELEASE_ASSERT(!m_vm->apiLock().currentThreadIsHoldingLock() || !m_vm->isCollectorBusyOnCurrentThread());
m_droppedLockCount = m_vm->apiLock().dropAllLocks(this);
- VM* previousVMInTLS = VM::exchange(nullptr);
- ASSERT_UNUSED(previousVMInTLS, previousVMInTLS == m_vm.get());
}
JSLock::DropAllLocks::DropAllLocks(ExecState* exec)
@@ -309,8 +302,6 @@
if (!m_vm)
return;
m_vm->apiLock().grabAllLocks(this, m_droppedLockCount);
- VM* previousVMInTLS = VM::exchange(m_vm.get());
- ASSERT_UNUSED(previousVMInTLS, previousVMInTLS);
}
} // namespace JSC
Modified: trunk/Source/_javascript_Core/runtime/JSLock.h (250724 => 250725)
--- trunk/Source/_javascript_Core/runtime/JSLock.h 2019-10-04 15:34:06 UTC (rev 250724)
+++ trunk/Source/_javascript_Core/runtime/JSLock.h 2019-10-04 15:35:03 UTC (rev 250725)
@@ -51,7 +51,6 @@
class ExecState;
class VM;
-class JSLock;
// This class is used to protect the initialization of the legacy single
// shared VM.
@@ -64,34 +63,32 @@
static Lock s_sharedInstanceMutex;
};
-// Only JSLockHolder can take a JSLock.
class JSLockHolder {
- WTF_MAKE_NONCOPYABLE(JSLockHolder);
- WTF_FORBID_HEAP_ALLOCATION(JSLockHolder);
public:
JS_EXPORT_PRIVATE JSLockHolder(VM*);
JS_EXPORT_PRIVATE JSLockHolder(VM&);
JS_EXPORT_PRIVATE JSLockHolder(ExecState*);
- enum LockIfVMIsLiveTag { LockIfVMIsLive };
- JS_EXPORT_PRIVATE JSLockHolder(LockIfVMIsLiveTag, JSLock&);
-
JS_EXPORT_PRIVATE ~JSLockHolder();
- VM* vm() { return m_vm.get(); }
-
private:
RefPtr<VM> m_vm;
- VM* m_previousVMInTLS { nullptr };
};
class JSLock : public ThreadSafeRefCounted<JSLock> {
WTF_MAKE_NONCOPYABLE(JSLock);
- friend class JSLockHolder;
public:
JSLock(VM*);
JS_EXPORT_PRIVATE ~JSLock();
+ JS_EXPORT_PRIVATE void lock();
+ JS_EXPORT_PRIVATE void unlock();
+
+ static void lock(ExecState*);
+ static void unlock(ExecState*);
+ static void lock(VM&);
+ static void unlock(VM&);
+
VM* vm() { return m_vm; }
Optional<RefPtr<Thread>> ownerThread() const
@@ -129,10 +126,6 @@
bool isWebThreadAware() const { return m_isWebThreadAware; }
private:
- // This is called only from JSLockHolder or DropAllLocks.
- JS_EXPORT_PRIVATE void lock();
- JS_EXPORT_PRIVATE void unlock();
-
void lock(intptr_t lockCount);
void unlock(intptr_t unlockCount);
Modified: trunk/Source/_javascript_Core/runtime/JSRunLoopTimer.cpp (250724 => 250725)
--- trunk/Source/_javascript_Core/runtime/JSRunLoopTimer.cpp 2019-10-04 15:34:06 UTC (rev 250724)
+++ trunk/Source/_javascript_Core/runtime/JSRunLoopTimer.cpp 2019-10-04 15:35:03 UTC (rev 250725)
@@ -297,12 +297,14 @@
}
}
- JSLockHolder locker(JSLockHolder::LockIfVMIsLive, m_apiLock.get());
- if (!locker.vm()) {
+ std::lock_guard<JSLock> lock(m_apiLock.get());
+ RefPtr<VM> vm = m_apiLock->vm();
+ if (!vm) {
// The VM has been destroyed, so we should just give up.
return;
}
- doWork(*locker.vm());
+
+ doWork(*vm);
}
JSRunLoopTimer::JSRunLoopTimer(VM& vm)
Modified: trunk/Source/_javascript_Core/runtime/VM.cpp (250724 => 250725)
--- trunk/Source/_javascript_Core/runtime/VM.cpp 2019-10-04 15:34:06 UTC (rev 250724)
+++ trunk/Source/_javascript_Core/runtime/VM.cpp 2019-10-04 15:35:03 UTC (rev 250725)
@@ -1379,16 +1379,4 @@
vmCreationShouldCrash = shouldCrash;
}
-
-#if !HAVE(FAST_TLS)
-WTF::ThreadSpecificKey VM::tlsKey { WTF::InvalidThreadSpecificKey };
-#endif
-
-void VM::initializeTLS()
-{
-#if !HAVE(FAST_TLS)
- WTF::threadSpecificKeyCreate(&tlsKey, nullptr);
-#endif
-}
-
} // namespace JSC
Modified: trunk/Source/_javascript_Core/runtime/VM.h (250724 => 250725)
--- trunk/Source/_javascript_Core/runtime/VM.h 2019-10-04 15:34:06 UTC (rev 250724)
+++ trunk/Source/_javascript_Core/runtime/VM.h 2019-10-04 15:35:03 UTC (rev 250725)
@@ -314,39 +314,6 @@
WeakRandom& random() { return m_random; }
Integrity::Random& integrityRandom() { return m_integrityRandom; }
-#if HAVE(FAST_TLS)
- static constexpr pthread_key_t tlsKey = WTF_VM_KEY;
-
- static VM* exchange(VM* vm)
- {
- VM* previous = current();
- _pthread_setspecific_direct(tlsKey, bitwise_cast<void*>(vm));
- return previous;
- }
-
- static VM* current()
- {
- return bitwise_cast<VM*>(_pthread_getspecific_direct(tlsKey));
- }
-#else
- static WTF::ThreadSpecificKey tlsKey;
-
- static VM* exchange(VM* vm)
- {
- ASSERT(tlsKey != WTF::InvalidThreadSpecificKey);
- VM* previous = current();
- WTF::threadSpecificSet(tlsKey, vm);
- return previous;
- }
-
- static VM* current()
- {
- ASSERT(tlsKey != WTF::InvalidThreadSpecificKey);
- return bitwise_cast<VM*>(WTF::threadSpecificGet(tlsKey));
- }
-#endif
- static void initializeTLS();
-
private:
unsigned nextID();
Modified: trunk/Source/WTF/ChangeLog (250724 => 250725)
--- trunk/Source/WTF/ChangeLog 2019-10-04 15:34:06 UTC (rev 250724)
+++ trunk/Source/WTF/ChangeLog 2019-10-04 15:35:03 UTC (rev 250725)
@@ -1,3 +1,15 @@
+2019-10-04 Truitt Savell <tsav...@apple.com>
+
+ Unreviewed, rolling out r250583.
+
+ Broke multiple internal API tests
+
+ Reverted changeset:
+
+ "[JSC] Place VM* in TLS"
+ https://bugs.webkit.org/show_bug.cgi?id=202391
+ https://trac.webkit.org/changeset/250583
+
2019-10-03 Keith Rollin <krol...@apple.com>
Remove some support for < iOS 13
Modified: trunk/Source/WTF/wtf/FastTLS.h (250724 => 250725)
--- trunk/Source/WTF/wtf/FastTLS.h 2019-10-04 15:34:06 UTC (rev 250724)
+++ trunk/Source/WTF/wtf/FastTLS.h 2019-10-04 15:35:03 UTC (rev 250725)
@@ -46,7 +46,7 @@
#define WTF_THREAD_DATA_KEY WTF_FAST_TLS_KEY0
#define WTF_WASM_CONTEXT_KEY WTF_FAST_TLS_KEY1
#define WTF_TESTING_KEY WTF_WASM_CONTEXT_KEY // So far, this key is only used in places that don't do WebAssembly, so it's OK that they share the same key.
-#define WTF_VM_KEY WTF_FAST_TLS_KEY2
+#define WTF_GC_TLC_KEY WTF_FAST_TLS_KEY2
#if ENABLE(FAST_TLS_JIT)
inline unsigned fastTLSOffsetForKey(unsigned long slot)
Modified: trunk/Source/WebCore/ChangeLog (250724 => 250725)
--- trunk/Source/WebCore/ChangeLog 2019-10-04 15:34:06 UTC (rev 250724)
+++ trunk/Source/WebCore/ChangeLog 2019-10-04 15:35:03 UTC (rev 250725)
@@ -1,3 +1,15 @@
+2019-10-04 Truitt Savell <tsav...@apple.com>
+
+ Unreviewed, rolling out r250583.
+
+ Broke multiple internal API tests
+
+ Reverted changeset:
+
+ "[JSC] Place VM* in TLS"
+ https://bugs.webkit.org/show_bug.cgi?id=202391
+ https://trac.webkit.org/changeset/250583
+
2019-10-04 Alex Christensen <achristen...@webkit.org>
Simplify sandbox enabling macros
Modified: trunk/Source/WebCore/bindings/js/IDBBindingUtilities.cpp (250724 => 250725)
--- trunk/Source/WebCore/bindings/js/IDBBindingUtilities.cpp 2019-10-04 15:34:06 UTC (rev 250724)
+++ trunk/Source/WebCore/bindings/js/IDBBindingUtilities.cpp 2019-10-04 15:35:03 UTC (rev 250725)
@@ -133,7 +133,7 @@
}
VM& vm = state.vm();
- JSLockHolder locker(vm);
+ Locker<JSLock> locker(vm.apiLock());
auto scope = DECLARE_THROW_SCOPE(vm);
switch (key->type()) {
@@ -386,9 +386,10 @@
auto serializedValue = SerializedScriptValue::createFromWireBytes(Vector<uint8_t>(data));
- JSLockHolder locker(globalObject.vm());
+ state.vm().apiLock().lock();
Vector<RefPtr<MessagePort>> messagePorts;
JSValue result = serializedValue->deserialize(state, &globalObject, messagePorts, value.blobURLs(), value.blobFilePaths(), SerializationErrorMode::NonThrowing);
+ state.vm().apiLock().unlock();
return result;
}