Changeset 167540 in webkit
- Timestamp:
- Apr 19, 2014 11:36:56 AM (10 years ago)
- Location:
- trunk/Source/bmalloc
- Files:
-
- 2 added
- 1 deleted
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/bmalloc/ChangeLog
r167526 r167540 1 2014-04-19 Geoffrey Garen <ggaren@apple.com> 2 3 bmalloc: Mutex should be harder to use wrong 4 https://bugs.webkit.org/show_bug.cgi?id=131879 5 6 Reviewed by Andreas Kling. 7 8 Mutex now has a proper constructor, so you can't deadlock by forgetting 9 to initialize it. 10 11 * bmalloc.xcodeproj/project.pbxproj: 12 * bmalloc/Allocator.cpp: 13 (bmalloc::Allocator::processXSmallAllocatorLog): 14 (bmalloc::Allocator::processSmallAllocatorLog): 15 (bmalloc::Allocator::processMediumAllocatorLog): 16 (bmalloc::Allocator::allocateLarge): 17 (bmalloc::Allocator::allocateXLarge): Global replace Mutex => StaticMutex, 18 since the Heap mutex is a static. 19 20 * bmalloc/AsyncTask.h: 21 (bmalloc::Function>::AsyncTask): Use Mutex, since we're not static. No 22 need for explicit initialization anymore. 23 24 * bmalloc/Deallocator.cpp: 25 (bmalloc::Deallocator::scavenge): 26 (bmalloc::Deallocator::deallocateLarge): 27 (bmalloc::Deallocator::deallocateXLarge): 28 (bmalloc::Deallocator::processObjectLog): 29 (bmalloc::Deallocator::deallocateSmallLine): 30 (bmalloc::Deallocator::deallocateXSmallLine): 31 (bmalloc::Deallocator::allocateSmallLine): 32 (bmalloc::Deallocator::allocateXSmallLine): 33 (bmalloc::Deallocator::deallocateMediumLine): 34 (bmalloc::Deallocator::allocateMediumLine): 35 * bmalloc/Deallocator.h: 36 * bmalloc/Heap.cpp: 37 (bmalloc::sleep): 38 (bmalloc::Heap::Heap): 39 (bmalloc::Heap::concurrentScavenge): 40 (bmalloc::Heap::scavenge): 41 (bmalloc::Heap::scavengeSmallPages): 42 (bmalloc::Heap::scavengeXSmallPages): 43 (bmalloc::Heap::scavengeMediumPages): 44 (bmalloc::Heap::scavengeLargeRanges): 45 (bmalloc::Heap::allocateXSmallLineSlowCase): 46 (bmalloc::Heap::allocateSmallLineSlowCase): 47 (bmalloc::Heap::allocateMediumLineSlowCase): 48 (bmalloc::Heap::allocateXLarge): 49 (bmalloc::Heap::deallocateXLarge): 50 (bmalloc::Heap::allocateLarge): 51 (bmalloc::Heap::deallocateLarge): 52 * bmalloc/Heap.h: 53 (bmalloc::Heap::deallocateXSmallLine): 54 (bmalloc::Heap::allocateXSmallLine): 55 (bmalloc::Heap::deallocateSmallLine): 56 (bmalloc::Heap::allocateSmallLine): 57 (bmalloc::Heap::deallocateMediumLine): 58 (bmalloc::Heap::allocateMediumLine): 59 * bmalloc/Line.h: 60 (bmalloc::Line<Traits>::deref): 61 * bmalloc/Mutex.cpp: Removed. 62 * bmalloc/Mutex.h: 63 (bmalloc::Mutex::Mutex): 64 (bmalloc::Mutex::init): Deleted. 65 (bmalloc::Mutex::try_lock): Deleted. 66 (bmalloc::Mutex::lock): Deleted. 67 (bmalloc::Mutex::unlock): Deleted. 68 * bmalloc/Page.h: 69 (bmalloc::Page<Traits>::ref): 70 (bmalloc::Page<Traits>::deref): 71 (bmalloc::Page<Traits>::refCount): 72 * bmalloc/PerProcess.h: 73 (bmalloc::PerProcess::mutex): 74 (bmalloc::PerProcess<T>::getSlowCase): 75 * bmalloc/StaticMutex.cpp: Added. 76 (bmalloc::StaticMutex::lockSlowCase): 77 * bmalloc/StaticMutex.h: Added. 78 (bmalloc::StaticMutex::init): 79 (bmalloc::StaticMutex::try_lock): 80 (bmalloc::StaticMutex::lock): 81 (bmalloc::StaticMutex::unlock): 82 * bmalloc/VMHeap.h: 83 (bmalloc::VMHeap::deallocateXSmallPage): 84 (bmalloc::VMHeap::deallocateSmallPage): 85 (bmalloc::VMHeap::deallocateMediumPage): 86 (bmalloc::VMHeap::deallocateLargeRange): 87 * bmalloc/bmalloc.h: 88 (bmalloc::api::scavenge): Global replace Mutex => StaticMutex, 89 since the Heap mutex is a static. 90 1 91 2014-04-18 Geoffrey Garen <ggaren@apple.com> 2 92 -
trunk/Source/bmalloc/bmalloc.xcodeproj/project.pbxproj
r167502 r167540 17 17 142FCC7B190080B8009032D4 /* XSmallTraits.h in Headers */ = {isa = PBXBuildFile; fileRef = 142FCC77190080B8009032D4 /* XSmallTraits.h */; }; 18 18 142FCC7D1900815E009032D4 /* XSmallAllocator.h in Headers */ = {isa = PBXBuildFile; fileRef = 142FCC7C1900815E009032D4 /* XSmallAllocator.h */; }; 19 143CB81C19022BC900B16A45 /* StaticMutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 143CB81A19022BC900B16A45 /* StaticMutex.cpp */; }; 20 143CB81D19022BC900B16A45 /* StaticMutex.h in Headers */ = {isa = PBXBuildFile; fileRef = 143CB81B19022BC900B16A45 /* StaticMutex.h */; }; 19 21 1448C30018F3754600502839 /* mbmalloc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1448C2FF18F3754300502839 /* mbmalloc.cpp */; }; 20 22 1448C30118F3754C00502839 /* bmalloc.h in Headers */ = {isa = PBXBuildFile; fileRef = 1448C2FE18F3754300502839 /* bmalloc.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 63 65 14F271C818EA3990008C152F /* ObjectType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 14105E8318E14374003A106E /* ObjectType.cpp */; }; 64 66 14F271C918EA3990008C152F /* VMHeap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 144F7BFB18BFC517003537F3 /* VMHeap.cpp */; }; 65 14F271CA18EA3990008C152F /* Mutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 144DCED817A728570093B2F2 /* Mutex.cpp */; };66 67 /* End PBXBuildFile section */ 67 68 … … 93 94 142FCC77190080B8009032D4 /* XSmallTraits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XSmallTraits.h; path = bmalloc/XSmallTraits.h; sourceTree = "<group>"; }; 94 95 142FCC7C1900815E009032D4 /* XSmallAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = XSmallAllocator.h; path = bmalloc/XSmallAllocator.h; sourceTree = "<group>"; }; 96 143CB81A19022BC900B16A45 /* StaticMutex.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StaticMutex.cpp; path = bmalloc/StaticMutex.cpp; sourceTree = "<group>"; }; 97 143CB81B19022BC900B16A45 /* StaticMutex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StaticMutex.h; path = bmalloc/StaticMutex.h; sourceTree = "<group>"; }; 95 98 143E29E918CAE8BE00FE8A0F /* MediumPage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MediumPage.h; path = bmalloc/MediumPage.h; sourceTree = "<group>"; }; 96 99 143E29ED18CAE90500FE8A0F /* SmallPage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SmallPage.h; path = bmalloc/SmallPage.h; sourceTree = "<group>"; }; … … 102 105 1448C2FF18F3754300502839 /* mbmalloc.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = mbmalloc.cpp; path = bmalloc/mbmalloc.cpp; sourceTree = "<group>"; }; 103 106 144DCED617A649D90093B2F2 /* Mutex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Mutex.h; path = bmalloc/Mutex.h; sourceTree = "<group>"; }; 104 144DCED817A728570093B2F2 /* Mutex.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Mutex.cpp; path = bmalloc/Mutex.cpp; sourceTree = "<group>"; };105 107 144F7BFB18BFC517003537F3 /* VMHeap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = VMHeap.cpp; path = bmalloc/VMHeap.cpp; sourceTree = "<group>"; }; 106 108 144F7BFC18BFC517003537F3 /* VMHeap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VMHeap.h; path = bmalloc/VMHeap.h; sourceTree = "<group>"; }; … … 280 282 14D9DB4517F2447100EAAB79 /* FixedVector.h */, 281 283 1413E460189DCE1E00546D68 /* Inline.h */, 282 144DCED817A728570093B2F2 /* Mutex.cpp */,283 284 144DCED617A649D90093B2F2 /* Mutex.h */, 284 285 14446A0717A61FA400F9EA1D /* PerProcess.h */, 285 286 144469FD17A61F1F00F9EA1D /* PerThread.h */, 286 287 145F6878179E3A4400D65598 /* Range.h */, 288 143CB81A19022BC900B16A45 /* StaticMutex.cpp */, 289 143CB81B19022BC900B16A45 /* StaticMutex.h */, 287 290 1417F64F18B7280C0076FA3F /* Syscall.h */, 288 291 1479E21217A1A255006D4E9D /* Vector.h */, … … 316 319 14DD78CA18F48D7500950702 /* Mutex.h in Headers */, 317 320 142FCC7D1900815E009032D4 /* XSmallAllocator.h in Headers */, 321 143CB81D19022BC900B16A45 /* StaticMutex.h in Headers */, 318 322 14DD78D118F48EC600950702 /* XLargeChunk.h in Headers */, 319 323 14DD78B918F48D6B00950702 /* MediumTraits.h in Headers */, … … 433 437 buildActionMask = 2147483647; 434 438 files = ( 435 14 F271CA18EA3990008C152F /*Mutex.cpp in Sources */,439 143CB81C19022BC900B16A45 /* StaticMutex.cpp in Sources */, 436 440 14F271C618EA3983008C152F /* SegregatedFreeList.cpp in Sources */, 437 441 14F271C318EA3978008C152F /* Allocator.cpp in Sources */, -
trunk/Source/bmalloc/bmalloc/Allocator.cpp
r167502 r167540 83 83 void Allocator::processXSmallAllocatorLog() 84 84 { 85 std::lock_guard< Mutex> lock(PerProcess<Heap>::mutex());85 std::lock_guard<StaticMutex> lock(PerProcess<Heap>::mutex()); 86 86 87 87 for (auto& logEntry : m_xSmallAllocatorLog) { … … 106 106 void Allocator::processSmallAllocatorLog() 107 107 { 108 std::lock_guard< Mutex> lock(PerProcess<Heap>::mutex());108 std::lock_guard<StaticMutex> lock(PerProcess<Heap>::mutex()); 109 109 110 110 for (auto& logEntry : m_smallAllocatorLog) { … … 129 129 void Allocator::processMediumAllocatorLog() 130 130 { 131 std::lock_guard< Mutex> lock(PerProcess<Heap>::mutex());131 std::lock_guard<StaticMutex> lock(PerProcess<Heap>::mutex()); 132 132 133 133 for (auto& logEntry : m_mediumAllocatorLog) { … … 142 142 { 143 143 size = roundUpToMultipleOf<largeAlignment>(size); 144 std::lock_guard< Mutex> lock(PerProcess<Heap>::mutex());144 std::lock_guard<StaticMutex> lock(PerProcess<Heap>::mutex()); 145 145 return PerProcess<Heap>::getFastCase()->allocateLarge(lock, size); 146 146 } … … 149 149 { 150 150 size = roundUpToMultipleOf<largeAlignment>(size); 151 std::lock_guard< Mutex> lock(PerProcess<Heap>::mutex());151 std::lock_guard<StaticMutex> lock(PerProcess<Heap>::mutex()); 152 152 return PerProcess<Heap>::getFastCase()->allocateXLarge(lock, size); 153 153 } -
trunk/Source/bmalloc/bmalloc/AsyncTask.h
r167526 r167540 75 75 , m_function(function) 76 76 { 77 m_conditionMutex.init();78 77 } 79 78 -
trunk/Source/bmalloc/bmalloc/Deallocator.cpp
r167502 r167540 56 56 processObjectLog(); 57 57 58 std::lock_guard< Mutex> lock(PerProcess<Heap>::mutex());58 std::lock_guard<StaticMutex> lock(PerProcess<Heap>::mutex()); 59 59 Heap* heap = PerProcess<Heap>::getFastCase(); 60 60 … … 69 69 void Deallocator::deallocateLarge(void* object) 70 70 { 71 std::lock_guard< Mutex> lock(PerProcess<Heap>::mutex());71 std::lock_guard<StaticMutex> lock(PerProcess<Heap>::mutex()); 72 72 PerProcess<Heap>::getFastCase()->deallocateLarge(lock, object); 73 73 } … … 75 75 void Deallocator::deallocateXLarge(void* object) 76 76 { 77 std::lock_guard< Mutex> lock(PerProcess<Heap>::mutex());77 std::lock_guard<StaticMutex> lock(PerProcess<Heap>::mutex()); 78 78 PerProcess<Heap>::getFastCase()->deallocateXLarge(lock, object); 79 79 } … … 81 81 void Deallocator::processObjectLog() 82 82 { 83 std::lock_guard< Mutex> lock(PerProcess<Heap>::mutex());83 std::lock_guard<StaticMutex> lock(PerProcess<Heap>::mutex()); 84 84 85 85 for (auto object : m_objectLog) { … … 126 126 } 127 127 128 void Deallocator::deallocateSmallLine(std::lock_guard< Mutex>& lock, SmallLine* line)128 void Deallocator::deallocateSmallLine(std::lock_guard<StaticMutex>& lock, SmallLine* line) 129 129 { 130 130 if (m_smallLineCache.size() == m_smallLineCache.capacity()) … … 134 134 } 135 135 136 void Deallocator::deallocateXSmallLine(std::lock_guard< Mutex>& lock, XSmallLine* line)136 void Deallocator::deallocateXSmallLine(std::lock_guard<StaticMutex>& lock, XSmallLine* line) 137 137 { 138 138 if (m_xSmallLineCache.size() == m_xSmallLineCache.capacity()) … … 145 145 { 146 146 if (!m_smallLineCache.size()) { 147 std::lock_guard< Mutex> lock(PerProcess<Heap>::mutex());147 std::lock_guard<StaticMutex> lock(PerProcess<Heap>::mutex()); 148 148 Heap* heap = PerProcess<Heap>::getFastCase(); 149 149 … … 158 158 { 159 159 if (!m_xSmallLineCache.size()) { 160 std::lock_guard< Mutex> lock(PerProcess<Heap>::mutex());160 std::lock_guard<StaticMutex> lock(PerProcess<Heap>::mutex()); 161 161 Heap* heap = PerProcess<Heap>::getFastCase(); 162 162 … … 168 168 } 169 169 170 void Deallocator::deallocateMediumLine(std::lock_guard< Mutex>& lock, MediumLine* line)170 void Deallocator::deallocateMediumLine(std::lock_guard<StaticMutex>& lock, MediumLine* line) 171 171 { 172 172 if (m_mediumLineCache.size() == m_mediumLineCache.capacity()) … … 179 179 { 180 180 if (!m_mediumLineCache.size()) { 181 std::lock_guard< Mutex> lock(PerProcess<Heap>::mutex());181 std::lock_guard<StaticMutex> lock(PerProcess<Heap>::mutex()); 182 182 Heap* heap = PerProcess<Heap>::getFastCase(); 183 183 -
trunk/Source/bmalloc/bmalloc/Deallocator.h
r167502 r167540 46 46 void deallocateSlowCase(void*); 47 47 48 void deallocateXSmallLine(std::lock_guard< Mutex>&, XSmallLine*);48 void deallocateXSmallLine(std::lock_guard<StaticMutex>&, XSmallLine*); 49 49 XSmallLine* allocateXSmallLine(); 50 50 51 void deallocateSmallLine(std::lock_guard< Mutex>&, SmallLine*);51 void deallocateSmallLine(std::lock_guard<StaticMutex>&, SmallLine*); 52 52 SmallLine* allocateSmallLine(); 53 53 54 void deallocateMediumLine(std::lock_guard< Mutex>&, MediumLine*);54 void deallocateMediumLine(std::lock_guard<StaticMutex>&, MediumLine*); 55 55 MediumLine* allocateMediumLine(); 56 56 -
trunk/Source/bmalloc/bmalloc/Heap.cpp
r167502 r167540 38 38 namespace bmalloc { 39 39 40 static inline void sleep(std::unique_lock< Mutex>& lock, std::chrono::milliseconds duration)40 static inline void sleep(std::unique_lock<StaticMutex>& lock, std::chrono::milliseconds duration) 41 41 { 42 42 if (duration == std::chrono::milliseconds(0)) … … 48 48 } 49 49 50 Heap::Heap(std::lock_guard< Mutex>&)50 Heap::Heap(std::lock_guard<StaticMutex>&) 51 51 : m_isAllocatingPages(false) 52 52 , m_scavenger(*this, &Heap::concurrentScavenge) … … 56 56 void Heap::concurrentScavenge() 57 57 { 58 std::unique_lock< Mutex> lock(PerProcess<Heap>::mutex());58 std::unique_lock<StaticMutex> lock(PerProcess<Heap>::mutex()); 59 59 scavenge(lock, scavengeSleepDuration); 60 60 } 61 61 62 void Heap::scavenge(std::unique_lock< Mutex>& lock, std::chrono::milliseconds sleepDuration)62 void Heap::scavenge(std::unique_lock<StaticMutex>& lock, std::chrono::milliseconds sleepDuration) 63 63 { 64 64 scavengeXSmallPages(lock, sleepDuration); … … 70 70 } 71 71 72 void Heap::scavengeSmallPages(std::unique_lock< Mutex>& lock, std::chrono::milliseconds sleepDuration)72 void Heap::scavengeSmallPages(std::unique_lock<StaticMutex>& lock, std::chrono::milliseconds sleepDuration) 73 73 { 74 74 while (1) { … … 86 86 } 87 87 88 void Heap::scavengeXSmallPages(std::unique_lock< Mutex>& lock, std::chrono::milliseconds sleepDuration)88 void Heap::scavengeXSmallPages(std::unique_lock<StaticMutex>& lock, std::chrono::milliseconds sleepDuration) 89 89 { 90 90 while (1) { … … 102 102 } 103 103 104 void Heap::scavengeMediumPages(std::unique_lock< Mutex>& lock, std::chrono::milliseconds sleepDuration)104 void Heap::scavengeMediumPages(std::unique_lock<StaticMutex>& lock, std::chrono::milliseconds sleepDuration) 105 105 { 106 106 while (1) { … … 118 118 } 119 119 120 void Heap::scavengeLargeRanges(std::unique_lock< Mutex>& lock, std::chrono::milliseconds sleepDuration)120 void Heap::scavengeLargeRanges(std::unique_lock<StaticMutex>& lock, std::chrono::milliseconds sleepDuration) 121 121 { 122 122 while (1) { … … 135 135 } 136 136 137 XSmallLine* Heap::allocateXSmallLineSlowCase(std::lock_guard< Mutex>& lock)137 XSmallLine* Heap::allocateXSmallLineSlowCase(std::lock_guard<StaticMutex>& lock) 138 138 { 139 139 m_isAllocatingPages = true; … … 156 156 } 157 157 158 SmallLine* Heap::allocateSmallLineSlowCase(std::lock_guard< Mutex>& lock)158 SmallLine* Heap::allocateSmallLineSlowCase(std::lock_guard<StaticMutex>& lock) 159 159 { 160 160 m_isAllocatingPages = true; … … 177 177 } 178 178 179 MediumLine* Heap::allocateMediumLineSlowCase(std::lock_guard< Mutex>& lock)179 MediumLine* Heap::allocateMediumLineSlowCase(std::lock_guard<StaticMutex>& lock) 180 180 { 181 181 m_isAllocatingPages = true; … … 198 198 } 199 199 200 void* Heap::allocateXLarge(std::lock_guard< Mutex>&, size_t size)200 void* Heap::allocateXLarge(std::lock_guard<StaticMutex>&, size_t size) 201 201 { 202 202 XLargeChunk* chunk = XLargeChunk::create(size); … … 210 210 } 211 211 212 void Heap::deallocateXLarge(std::lock_guard< Mutex>&, void* object)212 void Heap::deallocateXLarge(std::lock_guard<StaticMutex>&, void* object) 213 213 { 214 214 XLargeChunk* chunk = XLargeChunk::get(object); … … 216 216 } 217 217 218 void* Heap::allocateLarge(std::lock_guard< Mutex>&, size_t size)218 void* Heap::allocateLarge(std::lock_guard<StaticMutex>&, size_t size) 219 219 { 220 220 BASSERT(size <= largeMax); … … 240 240 } 241 241 242 void Heap::deallocateLarge(std::lock_guard< Mutex>&, void* object)242 void Heap::deallocateLarge(std::lock_guard<StaticMutex>&, void* object) 243 243 { 244 244 Range range = BoundaryTag::deallocate(object); -
trunk/Source/bmalloc/bmalloc/Heap.h
r167502 r167540 45 45 class Heap { 46 46 public: 47 Heap(std::lock_guard< Mutex>&);47 Heap(std::lock_guard<StaticMutex>&); 48 48 49 XSmallLine* allocateXSmallLine(std::lock_guard< Mutex>&);50 void deallocateXSmallLine(std::lock_guard< Mutex>&, XSmallLine*);49 XSmallLine* allocateXSmallLine(std::lock_guard<StaticMutex>&); 50 void deallocateXSmallLine(std::lock_guard<StaticMutex>&, XSmallLine*); 51 51 52 SmallLine* allocateSmallLine(std::lock_guard< Mutex>&);53 void deallocateSmallLine(std::lock_guard< Mutex>&, SmallLine*);52 SmallLine* allocateSmallLine(std::lock_guard<StaticMutex>&); 53 void deallocateSmallLine(std::lock_guard<StaticMutex>&, SmallLine*); 54 54 55 MediumLine* allocateMediumLine(std::lock_guard< Mutex>&);56 void deallocateMediumLine(std::lock_guard< Mutex>&, MediumLine*);55 MediumLine* allocateMediumLine(std::lock_guard<StaticMutex>&); 56 void deallocateMediumLine(std::lock_guard<StaticMutex>&, MediumLine*); 57 57 58 void* allocateLarge(std::lock_guard< Mutex>&, size_t);59 void deallocateLarge(std::lock_guard< Mutex>&, void*);58 void* allocateLarge(std::lock_guard<StaticMutex>&, size_t); 59 void deallocateLarge(std::lock_guard<StaticMutex>&, void*); 60 60 61 void* allocateXLarge(std::lock_guard< Mutex>&, size_t);62 void deallocateXLarge(std::lock_guard< Mutex>&, void*);61 void* allocateXLarge(std::lock_guard<StaticMutex>&, size_t); 62 void deallocateXLarge(std::lock_guard<StaticMutex>&, void*); 63 63 64 void scavenge(std::unique_lock< Mutex>&, std::chrono::milliseconds sleepDuration);64 void scavenge(std::unique_lock<StaticMutex>&, std::chrono::milliseconds sleepDuration); 65 65 66 66 private: 67 67 ~Heap() = delete; 68 68 69 XSmallLine* allocateXSmallLineSlowCase(std::lock_guard< Mutex>&);70 SmallLine* allocateSmallLineSlowCase(std::lock_guard< Mutex>&);71 MediumLine* allocateMediumLineSlowCase(std::lock_guard< Mutex>&);69 XSmallLine* allocateXSmallLineSlowCase(std::lock_guard<StaticMutex>&); 70 SmallLine* allocateSmallLineSlowCase(std::lock_guard<StaticMutex>&); 71 MediumLine* allocateMediumLineSlowCase(std::lock_guard<StaticMutex>&); 72 72 73 73 void* allocateLarge(Range, size_t); … … 80 80 81 81 void concurrentScavenge(); 82 void scavengeXSmallPages(std::unique_lock< Mutex>&, std::chrono::milliseconds);83 void scavengeSmallPages(std::unique_lock< Mutex>&, std::chrono::milliseconds);84 void scavengeMediumPages(std::unique_lock< Mutex>&, std::chrono::milliseconds);85 void scavengeLargeRanges(std::unique_lock< Mutex>&, std::chrono::milliseconds);82 void scavengeXSmallPages(std::unique_lock<StaticMutex>&, std::chrono::milliseconds); 83 void scavengeSmallPages(std::unique_lock<StaticMutex>&, std::chrono::milliseconds); 84 void scavengeMediumPages(std::unique_lock<StaticMutex>&, std::chrono::milliseconds); 85 void scavengeLargeRanges(std::unique_lock<StaticMutex>&, std::chrono::milliseconds); 86 86 87 87 Vector<XSmallLine*> m_xSmallLines; … … 101 101 }; 102 102 103 inline void Heap::deallocateXSmallLine(std::lock_guard< Mutex>& lock, XSmallLine* line)103 inline void Heap::deallocateXSmallLine(std::lock_guard<StaticMutex>& lock, XSmallLine* line) 104 104 { 105 105 XSmallPage* page = XSmallPage::get(line); … … 112 112 } 113 113 114 inline XSmallLine* Heap::allocateXSmallLine(std::lock_guard< Mutex>& lock)114 inline XSmallLine* Heap::allocateXSmallLine(std::lock_guard<StaticMutex>& lock) 115 115 { 116 116 while (m_xSmallLines.size()) { … … 126 126 } 127 127 128 inline void Heap::deallocateSmallLine(std::lock_guard< Mutex>& lock, SmallLine* line)128 inline void Heap::deallocateSmallLine(std::lock_guard<StaticMutex>& lock, SmallLine* line) 129 129 { 130 130 SmallPage* page = SmallPage::get(line); … … 137 137 } 138 138 139 inline SmallLine* Heap::allocateSmallLine(std::lock_guard< Mutex>& lock)139 inline SmallLine* Heap::allocateSmallLine(std::lock_guard<StaticMutex>& lock) 140 140 { 141 141 while (m_smallLines.size()) { … … 151 151 } 152 152 153 inline void Heap::deallocateMediumLine(std::lock_guard< Mutex>& lock, MediumLine* line)153 inline void Heap::deallocateMediumLine(std::lock_guard<StaticMutex>& lock, MediumLine* line) 154 154 { 155 155 MediumPage* page = MediumPage::get(line); … … 162 162 } 163 163 164 inline MediumLine* Heap::allocateMediumLine(std::lock_guard< Mutex>& lock)164 inline MediumLine* Heap::allocateMediumLine(std::lock_guard<StaticMutex>& lock) 165 165 { 166 166 while (m_mediumLines.size()) { -
trunk/Source/bmalloc/bmalloc/Line.h
r167502 r167540 47 47 48 48 void concurrentRef(unsigned char = 1); 49 bool deref(std::lock_guard< Mutex>&, unsigned char = 1);49 bool deref(std::lock_guard<StaticMutex>&, unsigned char = 1); 50 50 51 51 char* begin(); … … 89 89 90 90 template<class Traits> 91 inline bool Line<Traits>::deref(std::lock_guard< Mutex>&, unsigned char count)91 inline bool Line<Traits>::deref(std::lock_guard<StaticMutex>&, unsigned char count) 92 92 { 93 93 BASSERT(count <= m_refCount); -
trunk/Source/bmalloc/bmalloc/Mutex.h
r167526 r167540 27 27 #define Mutex_h 28 28 29 #include "BAssert.h" 30 #include <atomic> 29 #include "StaticMutex.h" 31 30 32 // A replacement for std::mutex that does not require an exit-time destructor.31 // A fast replacement for std::mutex. 33 32 34 33 namespace bmalloc { 35 34 36 structMutex {35 class Mutex : public StaticMutex { 37 36 public: 38 void init(); 39 40 void lock(); 41 bool try_lock(); 42 void unlock(); 43 44 private: 45 void lockSlowCase(); 46 47 std::atomic_flag m_flag; 37 Mutex(); 48 38 }; 49 39 50 inline void Mutex::init()40 inline Mutex::Mutex() 51 41 { 52 m_flag.clear(); 53 } 54 55 inline bool Mutex::try_lock() 56 { 57 return !m_flag.test_and_set(std::memory_order_acquire); 58 } 59 60 inline void Mutex::lock() 61 { 62 if (!try_lock()) 63 lockSlowCase(); 64 } 65 66 inline void Mutex::unlock() 67 { 68 m_flag.clear(std::memory_order_release); 42 init(); 69 43 } 70 44 -
trunk/Source/bmalloc/bmalloc/Page.h
r166956 r167540 46 46 static Page* get(Line*); 47 47 48 void ref(std::lock_guard< Mutex>&);49 bool deref(std::lock_guard< Mutex>&);50 unsigned refCount(std::lock_guard< Mutex>&);48 void ref(std::lock_guard<StaticMutex>&); 49 bool deref(std::lock_guard<StaticMutex>&); 50 unsigned refCount(std::lock_guard<StaticMutex>&); 51 51 52 52 Line* begin(); … … 58 58 59 59 template<typename Traits> 60 inline void Page<Traits>::ref(std::lock_guard< Mutex>&)60 inline void Page<Traits>::ref(std::lock_guard<StaticMutex>&) 61 61 { 62 62 BASSERT(m_refCount < maxRefCount); … … 65 65 66 66 template<typename Traits> 67 inline bool Page<Traits>::deref(std::lock_guard< Mutex>&)67 inline bool Page<Traits>::deref(std::lock_guard<StaticMutex>&) 68 68 { 69 69 BASSERT(m_refCount); … … 73 73 74 74 template<typename Traits> 75 inline unsigned Page<Traits>::refCount(std::lock_guard< Mutex>&)75 inline unsigned Page<Traits>::refCount(std::lock_guard<StaticMutex>&) 76 76 { 77 77 return m_refCount; -
trunk/Source/bmalloc/bmalloc/PerProcess.h
r166893 r167540 28 28 29 29 #include "Inline.h" 30 #include "Mutex.h"31 30 #include "Sizes.h" 31 #include "StaticMutex.h" 32 32 #include <mutex> 33 33 … … 49 49 // if (gobalFlag) { ... } // Undefined behavior. 50 50 // 51 // std::lock_guard< Mutex> lock(PerProcess<Object>::mutex());51 // std::lock_guard<StaticMutex> lock(PerProcess<Object>::mutex()); 52 52 // Object* object = PerProcess<Object>::get(lock); 53 53 // if (gobalFlag) { ... } // OK. … … 59 59 static T* getFastCase(); 60 60 61 static Mutex& mutex() { return s_mutex; }61 static StaticMutex& mutex() { return s_mutex; } 62 62 63 63 private: … … 65 65 66 66 static std::atomic<T*> s_object; 67 static Mutex s_mutex;67 static StaticMutex s_mutex; 68 68 69 69 typedef typename std::aligned_storage<sizeof(T), std::alignment_of<T>::value>::type Memory; … … 89 89 NO_INLINE T* PerProcess<T>::getSlowCase() 90 90 { 91 std::lock_guard< Mutex> lock(s_mutex);91 std::lock_guard<StaticMutex> lock(s_mutex); 92 92 if (!s_object.load(std::memory_order_consume)) { 93 93 T* t = new (&s_memory) T(lock); … … 101 101 102 102 template<typename T> 103 Mutex PerProcess<T>::s_mutex;103 StaticMutex PerProcess<T>::s_mutex; 104 104 105 105 template<typename T> -
trunk/Source/bmalloc/bmalloc/VMHeap.h
r167502 r167540 52 52 Range allocateLargeRange(size_t); 53 53 54 void deallocateXSmallPage(std::unique_lock< Mutex>&, XSmallPage*);55 void deallocateSmallPage(std::unique_lock< Mutex>&, SmallPage*);56 void deallocateMediumPage(std::unique_lock< Mutex>&, MediumPage*);57 void deallocateLargeRange(std::unique_lock< Mutex>&, Range);54 void deallocateXSmallPage(std::unique_lock<StaticMutex>&, XSmallPage*); 55 void deallocateSmallPage(std::unique_lock<StaticMutex>&, SmallPage*); 56 void deallocateMediumPage(std::unique_lock<StaticMutex>&, MediumPage*); 57 void deallocateLargeRange(std::unique_lock<StaticMutex>&, Range); 58 58 59 59 private: … … 101 101 } 102 102 103 inline void VMHeap::deallocateXSmallPage(std::unique_lock< Mutex>& lock, XSmallPage* page)103 inline void VMHeap::deallocateXSmallPage(std::unique_lock<StaticMutex>& lock, XSmallPage* page) 104 104 { 105 105 lock.unlock(); … … 110 110 } 111 111 112 inline void VMHeap::deallocateSmallPage(std::unique_lock< Mutex>& lock, SmallPage* page)112 inline void VMHeap::deallocateSmallPage(std::unique_lock<StaticMutex>& lock, SmallPage* page) 113 113 { 114 114 lock.unlock(); … … 119 119 } 120 120 121 inline void VMHeap::deallocateMediumPage(std::unique_lock< Mutex>& lock, MediumPage* page)121 inline void VMHeap::deallocateMediumPage(std::unique_lock<StaticMutex>& lock, MediumPage* page) 122 122 { 123 123 lock.unlock(); … … 128 128 } 129 129 130 inline void VMHeap::deallocateLargeRange(std::unique_lock< Mutex>& lock, Range range)130 inline void VMHeap::deallocateLargeRange(std::unique_lock<StaticMutex>& lock, Range range) 131 131 { 132 132 BeginTag* beginTag = LargeChunk::beginTag(range.begin()); -
trunk/Source/bmalloc/bmalloc/bmalloc.h
r167502 r167540 92 92 PerThread<Cache>::get()->scavenge(); 93 93 94 std::unique_lock< Mutex> lock(PerProcess<Heap>::mutex());94 std::unique_lock<StaticMutex> lock(PerProcess<Heap>::mutex()); 95 95 PerProcess<Heap>::get()->scavenge(lock, std::chrono::milliseconds(0)); 96 96 }
Note: See TracChangeset
for help on using the changeset viewer.