Changeset 225617 in webkit
- Timestamp:
- Dec 6, 2017 7:52:09 PM (6 years ago)
- Location:
- trunk/Source/WTF
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/ChangeLog
r225563 r225617 1 2017-12-06 Yusuke Suzuki <utatane.tea@gmail.com> 2 3 [WTF] Remove XXXLockBase since constexpr constructor can initialize static variables without calling global constructors 4 https://bugs.webkit.org/show_bug.cgi?id=180495 5 6 Reviewed by Mark Lam. 7 8 Very nice feature of C++11 is that constexpr constructor can initialize static global variables 9 without calling global constructors. We do not need to have XXXLockBase with derived XXXLock 10 class since StaticXXXLock can have constructors as long as it is constexpr. 11 We remove bunch of these classes, and set `XXXLock() = default;` explicitly for readability. 12 C++11's default constructor is constexpr as long as its member's default constructor / default 13 initializer is constexpr. 14 15 * wtf/Condition.h: 16 (WTF::ConditionBase::construct): Deleted. 17 (WTF::ConditionBase::waitUntil): Deleted. 18 (WTF::ConditionBase::waitFor): Deleted. 19 (WTF::ConditionBase::wait): Deleted. 20 (WTF::ConditionBase::notifyOne): Deleted. 21 (WTF::ConditionBase::notifyAll): Deleted. 22 (WTF::Condition::Condition): Deleted. 23 * wtf/CountingLock.h: 24 (WTF::CountingLock::CountingLock): Deleted. 25 (WTF::CountingLock::~CountingLock): Deleted. 26 * wtf/Lock.cpp: 27 (WTF::Lock::lockSlow): 28 (WTF::Lock::unlockSlow): 29 (WTF::Lock::unlockFairlySlow): 30 (WTF::Lock::safepointSlow): 31 (WTF::LockBase::lockSlow): Deleted. 32 (WTF::LockBase::unlockSlow): Deleted. 33 (WTF::LockBase::unlockFairlySlow): Deleted. 34 (WTF::LockBase::safepointSlow): Deleted. 35 * wtf/Lock.h: 36 (WTF::LockBase::construct): Deleted. 37 (WTF::LockBase::lock): Deleted. 38 (WTF::LockBase::tryLock): Deleted. 39 (WTF::LockBase::try_lock): Deleted. 40 (WTF::LockBase::unlock): Deleted. 41 (WTF::LockBase::unlockFairly): Deleted. 42 (WTF::LockBase::safepoint): Deleted. 43 (WTF::LockBase::isHeld const): Deleted. 44 (WTF::LockBase::isLocked const): Deleted. 45 (WTF::LockBase::isFullyReset const): Deleted. 46 (WTF::Lock::Lock): Deleted. 47 * wtf/ReadWriteLock.cpp: 48 (WTF::ReadWriteLock::readLock): 49 (WTF::ReadWriteLock::readUnlock): 50 (WTF::ReadWriteLock::writeLock): 51 (WTF::ReadWriteLock::writeUnlock): 52 (WTF::ReadWriteLockBase::construct): Deleted. 53 (WTF::ReadWriteLockBase::readLock): Deleted. 54 (WTF::ReadWriteLockBase::readUnlock): Deleted. 55 (WTF::ReadWriteLockBase::writeLock): Deleted. 56 (WTF::ReadWriteLockBase::writeUnlock): Deleted. 57 * wtf/ReadWriteLock.h: 58 (WTF::ReadWriteLock::read): 59 (WTF::ReadWriteLock::write): 60 (WTF::ReadWriteLockBase::ReadLock::tryLock): Deleted. 61 (WTF::ReadWriteLockBase::ReadLock::lock): Deleted. 62 (WTF::ReadWriteLockBase::ReadLock::unlock): Deleted. 63 (WTF::ReadWriteLockBase::WriteLock::tryLock): Deleted. 64 (WTF::ReadWriteLockBase::WriteLock::lock): Deleted. 65 (WTF::ReadWriteLockBase::WriteLock::unlock): Deleted. 66 (WTF::ReadWriteLockBase::read): Deleted. 67 (WTF::ReadWriteLockBase::write): Deleted. 68 (WTF::ReadWriteLock::ReadWriteLock): Deleted. 69 * wtf/RecursiveLockAdapter.h: 70 (WTF::RecursiveLockAdapter::RecursiveLockAdapter): Deleted. 71 * wtf/WordLock.cpp: 72 (WTF::WordLock::lockSlow): 73 (WTF::WordLock::unlockSlow): 74 (WTF::WordLockBase::lockSlow): Deleted. 75 (WTF::WordLockBase::unlockSlow): Deleted. 76 * wtf/WordLock.h: 77 (WTF::WordLockBase::lock): Deleted. 78 (WTF::WordLockBase::unlock): Deleted. 79 (WTF::WordLockBase::isHeld const): Deleted. 80 (WTF::WordLockBase::isLocked const): Deleted. 81 (WTF::WordLockBase::isFullyReset const): Deleted. 82 (WTF::WordLock::WordLock): Deleted. 83 * wtf/WorkQueue.cpp: 84 1 85 2017-12-05 Stephan Szabo <stephan.szabo@sony.com> 2 86 -
trunk/Source/WTF/wtf/Condition.h
r220322 r225617 42 42 // case where no thread is waiting. This condition variable, when used with WTF::Lock, can 43 43 // outperform a system condition variable and lock by up to 58x. 44 45 // This is a struct without a constructor or destructor so that it can be statically initialized. 46 // Use Lock in instance variables. 47 struct ConditionBase { 44 class Condition { 45 WTF_MAKE_NONCOPYABLE(Condition); 46 public: 48 47 // Condition will accept any kind of time and convert it internally, but this typedef tells 49 48 // you what kind of time Condition would be able to use without conversions. However, if you 50 49 // are unlikely to be affected by the cost of conversions, it is better to use MonotonicTime. 51 typedef ParkingLot::Time Time; 52 53 void construct() 54 { 55 m_hasWaiters.store(false); 56 } 57 50 using Time = ParkingLot::Time; 51 52 Condition() = default; 53 58 54 // Wait on a parking queue while releasing the given lock. It will unlock the lock just before 59 55 // parking, and relock it upon wakeup. Returns true if we woke up due to some call to … … 175 171 176 172 private: 177 Atomic<bool> m_hasWaiters ;173 Atomic<bool> m_hasWaiters { false }; 178 174 }; 179 175 180 class Condition : public ConditionBase { 181 WTF_MAKE_NONCOPYABLE(Condition); 182 public: 183 Condition() 184 { 185 construct(); 186 } 187 }; 188 189 typedef ConditionBase StaticCondition; 176 using StaticCondition = Condition; 190 177 191 178 } // namespace WTF -
trunk/Source/WTF/wtf/CountingLock.h
r225524 r225617 56 56 57 57 class CountingLock { 58 WTF_MAKE_NONCOPYABLE(CountingLock); 59 WTF_MAKE_FAST_ALLOCATED; 60 58 61 typedef unsigned LockType; 59 62 … … 78 81 79 82 public: 80 CountingLock() 81 { 82 m_word.storeRelaxed(0); 83 } 84 85 ~CountingLock() 86 { 87 } 83 CountingLock() = default; 88 84 89 85 bool tryLock() … … 266 262 } 267 263 268 Atomic<LockType> m_word ;264 Atomic<LockType> m_word { 0 }; 269 265 }; 270 266 -
trunk/Source/WTF/wtf/Lock.cpp
r225524 r225617 34 34 static constexpr bool profileLockContention = false; 35 35 36 void Lock Base::lockSlow()36 void Lock::lockSlow() 37 37 { 38 38 if (profileLockContention) … … 41 41 } 42 42 43 void Lock Base::unlockSlow()43 void Lock::unlockSlow() 44 44 { 45 45 DefaultLockAlgorithm::unlockSlow(m_byte, DefaultLockAlgorithm::Unfair); 46 46 } 47 47 48 void Lock Base::unlockFairlySlow()48 void Lock::unlockFairlySlow() 49 49 { 50 50 DefaultLockAlgorithm::unlockSlow(m_byte, DefaultLockAlgorithm::Fair); 51 51 } 52 52 53 void Lock Base::safepointSlow()53 void Lock::safepointSlow() 54 54 { 55 55 DefaultLockAlgorithm::safepointSlow(m_byte); -
trunk/Source/WTF/wtf/Lock.h
r220322 r225617 49 49 // the head of the queue. When there are collisions, each collision increases the fair unlock delay 50 50 // by one millisecond in the worst case. 51 class Lock { 52 WTF_MAKE_NONCOPYABLE(Lock); 53 WTF_MAKE_FAST_ALLOCATED; 54 public: 55 Lock() = default; 51 56 52 // This is a struct without a constructor or destructor so that it can be statically initialized.53 // Use Lock in instance variables.54 struct LockBase {55 void construct()56 {57 m_byte.store(0, std::memory_order_relaxed);58 }59 60 57 void lock() 61 58 { … … 133 130 } 134 131 135 Atomic<uint8_t> m_byte ;132 Atomic<uint8_t> m_byte { 0 }; 136 133 }; 137 134 138 class Lock : public LockBase { 139 WTF_MAKE_NONCOPYABLE(Lock); 140 WTF_MAKE_FAST_ALLOCATED; 141 public: 142 Lock() 143 { 144 construct(); 145 } 146 }; 147 148 typedef LockBase StaticLock; 149 typedef Locker<LockBase> LockHolder; 135 using StaticLock = Lock; 136 using LockHolder = Locker<Lock>; 150 137 151 138 } // namespace WTF -
trunk/Source/WTF/wtf/ReadWriteLock.cpp
r220322 r225617 31 31 namespace WTF { 32 32 33 void ReadWriteLockBase::construct() 34 { 35 m_lock.construct(); 36 m_cond.construct(); 37 m_isWriteLocked = false; 38 m_numReaders = 0; 39 m_numWaitingWriters = 0; 40 } 41 42 void ReadWriteLockBase::readLock() 33 void ReadWriteLock::readLock() 43 34 { 44 35 auto locker = holdLock(m_lock); … … 48 39 } 49 40 50 void ReadWriteLock Base::readUnlock()41 void ReadWriteLock::readUnlock() 51 42 { 52 43 auto locker = holdLock(m_lock); … … 56 47 } 57 48 58 void ReadWriteLock Base::writeLock()49 void ReadWriteLock::writeLock() 59 50 { 60 51 auto locker = holdLock(m_lock); … … 67 58 } 68 59 69 void ReadWriteLock Base::writeUnlock()60 void ReadWriteLock::writeUnlock() 70 61 { 71 62 auto locker = holdLock(m_lock); -
trunk/Source/WTF/wtf/ReadWriteLock.h
r220322 r225617 36 36 // the longer the read critical section has to be for this locking scheme to be profitable. 37 37 38 struct ReadWriteLockBase { 39 WTF_EXPORT_PRIVATE void construct(); 40 38 class ReadWriteLock { 39 WTF_MAKE_NONCOPYABLE(ReadWriteLock); 40 WTF_MAKE_FAST_ALLOCATED; 41 public: 42 ReadWriteLock() = default; 43 41 44 // It's easiest to read lock like this: 42 45 // … … 59 62 60 63 private: 61 // These fields must work when zero-filled, so that StaticReadWriteLock works. 62 LockBase m_lock; 63 ConditionBase m_cond; 64 bool m_isWriteLocked; 65 unsigned m_numReaders; 66 unsigned m_numWaitingWriters; 64 Lock m_lock; 65 Condition m_cond; 66 bool m_isWriteLocked { false }; 67 unsigned m_numReaders { 0 }; 68 unsigned m_numWaitingWriters { 0 }; 67 69 }; 68 70 69 class ReadWriteLock Base::ReadLock : public ReadWriteLockBase{71 class ReadWriteLock::ReadLock : public ReadWriteLock { 70 72 public: 71 73 bool tryLock() { return false; } … … 74 76 }; 75 77 76 class ReadWriteLock Base::WriteLock : public ReadWriteLockBase{78 class ReadWriteLock::WriteLock : public ReadWriteLock { 77 79 public: 78 80 bool tryLock() { return false; } … … 81 83 }; 82 84 83 inline ReadWriteLock Base::ReadLock& ReadWriteLockBase::read() { return *static_cast<ReadLock*>(this); }84 inline ReadWriteLock Base::WriteLock& ReadWriteLockBase::write() { return *static_cast<WriteLock*>(this); }85 inline ReadWriteLock::ReadLock& ReadWriteLock::read() { return *static_cast<ReadLock*>(this); } 86 inline ReadWriteLock::WriteLock& ReadWriteLock::write() { return *static_cast<WriteLock*>(this); } 85 87 86 class ReadWriteLock : public ReadWriteLockBase { 87 public: 88 ReadWriteLock() 89 { 90 construct(); 91 } 92 }; 93 94 typedef ReadWriteLockBase StaticReadWriteLock; 88 using StaticReadWriteLock = ReadWriteLock; 95 89 96 90 } // namespace WTF -
trunk/Source/WTF/wtf/RecursiveLockAdapter.h
r225470 r225617 33 33 class RecursiveLockAdapter { 34 34 public: 35 RecursiveLockAdapter() 36 { 37 } 38 35 RecursiveLockAdapter() = default; 36 39 37 void lock() 40 38 { -
trunk/Source/WTF/wtf/WordLock.cpp
r223965 r225617 77 77 } // anonymous namespace 78 78 79 NEVER_INLINE void WordLock Base::lockSlow()79 NEVER_INLINE void WordLock::lockSlow() 80 80 { 81 81 unsigned spinCount = 0; … … 178 178 } 179 179 180 NEVER_INLINE void WordLock Base::unlockSlow()180 NEVER_INLINE void WordLock::unlockSlow() 181 181 { 182 182 // The fast path can fail either because of spurious weak CAS failure, or because someone put a -
trunk/Source/WTF/wtf/WordLock.h
r209808 r225617 47 47 // try to use dataLog to debug this code, you will have a bad time. 48 48 49 struct WordLockBase { 49 class WordLock { 50 WTF_MAKE_NONCOPYABLE(WordLock); 51 WTF_MAKE_FAST_ALLOCATED; 52 public: 53 WordLock() = default; 54 50 55 void lock() 51 56 { … … 94 99 } 95 100 96 Atomic<uintptr_t> m_word ;101 Atomic<uintptr_t> m_word { 0 }; 97 102 }; 98 103 99 class WordLock : public WordLockBase { 100 WTF_MAKE_NONCOPYABLE(WordLock); 101 public: 102 WordLock() 103 { 104 m_word.store(0, std::memory_order_relaxed); 105 } 106 }; 107 108 typedef WordLockBase StaticWordLock; 109 typedef Locker<WordLockBase> WordLockHolder; 104 using StaticWordLock = WordLock; 105 using WordLockHolder = Locker<WordLock>; 110 106 111 107 } // namespace WTF -
trunk/Source/WTF/wtf/WorkQueue.cpp
- Property svn:executable deleted
Note: See TracChangeset
for help on using the changeset viewer.