Changeset 181547 in webkit
- Timestamp:
- Mar 16, 2015, 5:14:19 AM (11 years ago)
- Location:
- releases/WebKitGTK/webkit-2.8/Source
- Files:
-
- 7 edited
-
JavaScriptCore/ChangeLog (modified) (1 diff)
-
JavaScriptCore/bytecode/CodeBlock.cpp (modified) (5 diffs)
-
JavaScriptCore/bytecode/CodeBlock.h (modified) (1 diff)
-
JavaScriptCore/dfg/DFGCommon.cpp (modified) (1 diff)
-
WTF/ChangeLog (modified) (1 diff)
-
WTF/wtf/Atomics.h (modified) (4 diffs)
-
WTF/wtf/ByteSpinLock.h (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
releases/WebKitGTK/webkit-2.8/Source/JavaScriptCore/ChangeLog
r181545 r181547 1 2015-03-13 Mark Lam <mark.lam@apple.com> 2 3 Introduce WTF::Atomic to wrap std::atomic for a friendlier CAS. 4 <https://webkit.org/b/142661> 5 6 Reviewed by Filip Pizlo. 7 8 Changed CodeBlock, and the DFG's crashLock to use WTF::Atomic instead of 9 std::atomic. 10 11 * bytecode/CodeBlock.cpp: 12 (JSC::CodeBlock::CodeBlock): 13 (JSC::CodeBlock::visitAggregate): 14 * bytecode/CodeBlock.h: 15 * dfg/DFGCommon.cpp: 16 (JSC::DFG::startCrashing): 17 1 18 2015-03-12 Mark Lam <mark.lam@apple.com> 2 19 -
releases/WebKitGTK/webkit-2.8/Source/JavaScriptCore/bytecode/CodeBlock.cpp
r181541 r181547 1630 1630 , m_needsActivation(other.m_needsActivation) 1631 1631 , m_mayBeExecuting(false) 1632 , m_visitAggregateHasBeenCalled(false)1633 1632 , m_source(other.m_source) 1634 1633 , m_sourceOffset(other.m_sourceOffset) … … 1646 1645 #endif 1647 1646 { 1647 m_visitAggregateHasBeenCalled.store(false, std::memory_order_relaxed); 1648 1648 1649 ASSERT(m_heap->isDeferred()); 1649 1650 ASSERT(m_scopeRegister.isLocal()); … … 1691 1692 , m_needsActivation(unlinkedCodeBlock->hasActivationRegister() && unlinkedCodeBlock->codeType() == FunctionCode) 1692 1693 , m_mayBeExecuting(false) 1693 , m_visitAggregateHasBeenCalled(false)1694 1694 , m_source(sourceProvider) 1695 1695 , m_sourceOffset(sourceOffset) … … 1703 1703 #endif 1704 1704 { 1705 m_visitAggregateHasBeenCalled.store(false, std::memory_order_relaxed); 1706 1705 1707 ASSERT(m_heap->isDeferred()); 1706 1708 ASSERT(m_scopeRegister.isLocal()); … … 2209 2211 // To this end, use an atomic operation to check (and set) if I've been called already. 2210 2212 // Only one thread may proceed past this point - whichever one wins the atomic set race. 2211 bool expected = false; 2212 bool setByMe = m_visitAggregateHasBeenCalled.compare_exchange_strong(expected, true, std::memory_order_acquire); 2213 bool setByMe = m_visitAggregateHasBeenCalled.compare_exchange_strong(false, true, std::memory_order_acquire); 2213 2214 if (!setByMe) 2214 2215 return; -
releases/WebKitGTK/webkit-2.8/Source/JavaScriptCore/bytecode/CodeBlock.h
r181541 r181547 1057 1057 bool m_needsActivation; 1058 1058 bool m_mayBeExecuting; 1059 std::atomic<bool> m_visitAggregateHasBeenCalled;1059 Atomic<bool> m_visitAggregateHasBeenCalled; 1060 1060 1061 1061 RefPtr<SourceProvider> m_source; -
releases/WebKitGTK/webkit-2.8/Source/JavaScriptCore/dfg/DFGCommon.cpp
r181545 r181547 34 34 namespace JSC { namespace DFG { 35 35 36 static std::atomic<unsigned> crashLock;36 static Atomic<unsigned> crashLock; 37 37 38 38 void startCrashing() 39 39 { 40 unsigned expected = 0; 41 while (!crashLock.compare_exchange_weak(expected, 1, std::memory_order_acquire)) { 40 while (!crashLock.compare_exchange_weak(0, 1, std::memory_order_acquire)) 42 41 std::this_thread::yield(); 43 expected = 0;44 }45 42 } 46 43 -
releases/WebKitGTK/webkit-2.8/Source/WTF/ChangeLog
r181544 r181547 1 2015-03-13 Mark Lam <mark.lam@apple.com> 2 3 Introduce WTF::Atomic to wrap std::atomic for a friendlier CAS. 4 <https://webkit.org/b/142661> 5 6 Reviewed by Filip Pizlo. 7 8 The CAS functions provided by std::atomic takes a reference to the expected 9 value and modifies it if the CAS fails. However, in a lot of our CAS usage, 10 we don't want the expected value to change. The solution to this is to 11 provide a WTF::Atomic struct that wraps std::atomic, and provide CAS 12 methods that won't alter the expected value if the CAS fails. 13 14 The method names in WTF::Atomic are chosen to be identical to those 15 in std::atomic so that WTF::Atomic can be a simple drop in replacement 16 for std::atomic. 17 18 Also changed ByteSpinLock to use WTF::Atomic instead of std::atomic. 19 20 * wtf/Atomics.h: 21 (WTF::Atomic::load): 22 (WTF::Atomic::store): 23 (WTF::Atomic::compare_exchange_weak): 24 (WTF::Atomic::compare_exchange_strong): 25 * wtf/ByteSpinLock.h: 26 (WTF::ByteSpinLock::ByteSpinLock): 27 (WTF::ByteSpinLock::lock): 28 1 29 2015-03-14 Michael Saboff <msaboff@apple.com> 2 30 -
releases/WebKitGTK/webkit-2.8/Source/WTF/wtf/Atomics.h
r181375 r181547 1 1 /* 2 * Copyright (C) 2007 , 2008, 2010, 2012, 2013Apple Inc. All rights reserved.2 * Copyright (C) 2007-2008, 2010, 2012-2013, 2015 Apple Inc. All rights reserved. 3 3 * Copyright (C) 2007 Justin Haygood (jhaygood@reaktix.com) 4 4 * … … 60 60 #define Atomics_h 61 61 62 #include <atomic> 62 63 #include <wtf/StdLibExtras.h> 63 64 … … 71 72 72 73 namespace WTF { 74 75 // Atomic wraps around std::atomic with the sole purpose of making the compare_exchange 76 // operations not alter the expected value. This is more in line with how we typically 77 // use CAS in our code. 78 // 79 // Atomic is a struct without explicitly defined constructors so that it can be 80 // initialized at compile time. 81 82 template<typename T> 83 struct Atomic { 84 85 T load(std::memory_order order) const { return value.load(order); } 86 87 void store(T desired, std::memory_order order) { value.store(desired, order); } 88 89 bool compare_exchange_weak(T expected, T desired, std::memory_order order) 90 { 91 T expectedOrActual = expected; 92 return value.compare_exchange_weak(expectedOrActual, desired, order); 93 } 94 95 bool compare_exchange_strong(T expected, T desired, std::memory_order order) 96 { 97 T expectedOrActual = expected; 98 return value.compare_exchange_strong(expectedOrActual, desired, order); 99 } 100 101 std::atomic<T> value; 102 }; 73 103 74 104 #if OS(WINDOWS) … … 346 376 } // namespace WTF 347 377 378 using WTF::Atomic; 379 348 380 #endif // Atomics_h -
releases/WebKitGTK/webkit-2.8/Source/WTF/wtf/ByteSpinLock.h
r181543 r181547 1 1 /* 2 * Copyright (C) 2013 Apple Inc. All rights reserved.2 * Copyright (C) 2013, 2015 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 27 27 #define ByteSpinLock_h 28 28 29 #include <atomic>30 29 #include <thread> 31 30 #include <wtf/Assertions.h> 31 #include <wtf/Atomics.h> 32 32 #include <wtf/Locker.h> 33 33 #include <wtf/Noncopyable.h> … … 39 39 public: 40 40 ByteSpinLock() 41 : m_lock(false)42 41 { 42 m_lock.store(false, std::memory_order_relaxed); 43 43 } 44 44 45 45 void lock() 46 46 { 47 bool expected = false; 48 while (!m_lock.compare_exchange_weak(expected, true, std::memory_order_acquire)) { 47 while (!m_lock.compare_exchange_weak(false, true, std::memory_order_acquire)) 49 48 std::this_thread::yield(); 50 expected = false;51 }52 49 } 53 50 … … 60 57 61 58 private: 62 std::atomic<bool> m_lock;59 Atomic<bool> m_lock; 63 60 }; 64 61
Note:
See TracChangeset
for help on using the changeset viewer.