Changeset 240171 in webkit
- Timestamp:
- Jan 18, 2019 1:32:32 PM (5 years ago)
- Location:
- trunk/Source
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r240160 r240171 1 2019-01-18 Matt Lewis <jlewis3@apple.com> 2 3 Unreviewed, rolling out r240160. 4 5 This broke multiple internal builds. 6 7 Reverted changeset: 8 9 "Gigacages should start allocations from a slide" 10 https://bugs.webkit.org/show_bug.cgi?id=193523 11 https://trac.webkit.org/changeset/240160 12 1 13 2019-01-18 Keith Miller <keith_miller@apple.com> 2 14 -
trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm
r240160 r240171 1316 1316 btiz t0, IsArray, .opGetByIdSlow 1317 1317 btiz t0, IndexingShapeMask, .opGetByIdSlow 1318 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::jsValue, constexpr Gigacage::jsValueGigacageMask, JSObject::m_butterfly[t3], t0, t1)1318 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::jsValue, constexpr JSVALUE_GIGACAGE_MASK, JSObject::m_butterfly[t3], t0, t1) 1319 1319 loadi -sizeof IndexingHeader + IndexingHeader::u.lengths.publicLength[t0], t0 1320 1320 bilt t0, 0, .opGetByIdSlow … … 1439 1439 sxi2q t1, t1 1440 1440 1441 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::jsValue, constexpr Gigacage::jsValueGigacageMask, JSObject::m_butterfly[t0], t3, tagTypeNumber)1441 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::jsValue, constexpr JSVALUE_GIGACAGE_MASK, JSObject::m_butterfly[t0], t3, tagTypeNumber) 1442 1442 move TagTypeNumber, tagTypeNumber 1443 1443 … … 1505 1505 1506 1506 # We have Int8ArrayType. 1507 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::primitive, constexpr Gigacage::primitiveGigacageMask, JSArrayBufferView::m_vector[t0], t3, t2)1507 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::primitive, constexpr PRIMITIVE_GIGACAGE_MASK, JSArrayBufferView::m_vector[t0], t3, t2) 1508 1508 loadbs [t3, t1], t0 1509 1509 finishIntGetByVal(t0, t1) … … 1513 1513 1514 1514 # We have Uint8ArrayType. 1515 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::primitive, constexpr Gigacage::primitiveGigacageMask, JSArrayBufferView::m_vector[t0], t3, t2)1515 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::primitive, constexpr PRIMITIVE_GIGACAGE_MASK, JSArrayBufferView::m_vector[t0], t3, t2) 1516 1516 loadb [t3, t1], t0 1517 1517 finishIntGetByVal(t0, t1) … … 1519 1519 .opGetByValUint8ClampedArray: 1520 1520 # We have Uint8ClampedArrayType. 1521 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::primitive, constexpr Gigacage::primitiveGigacageMask, JSArrayBufferView::m_vector[t0], t3, t2)1521 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::primitive, constexpr PRIMITIVE_GIGACAGE_MASK, JSArrayBufferView::m_vector[t0], t3, t2) 1522 1522 loadb [t3, t1], t0 1523 1523 finishIntGetByVal(t0, t1) … … 1528 1528 1529 1529 # We have Int16ArrayType. 1530 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::primitive, constexpr Gigacage::primitiveGigacageMask, JSArrayBufferView::m_vector[t0], t3, t2)1530 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::primitive, constexpr PRIMITIVE_GIGACAGE_MASK, JSArrayBufferView::m_vector[t0], t3, t2) 1531 1531 loadhs [t3, t1, 2], t0 1532 1532 finishIntGetByVal(t0, t1) … … 1534 1534 .opGetByValUint16Array: 1535 1535 # We have Uint16ArrayType. 1536 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::primitive, constexpr Gigacage::primitiveGigacageMask, JSArrayBufferView::m_vector[t0], t3, t2)1536 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::primitive, constexpr PRIMITIVE_GIGACAGE_MASK, JSArrayBufferView::m_vector[t0], t3, t2) 1537 1537 loadh [t3, t1, 2], t0 1538 1538 finishIntGetByVal(t0, t1) … … 1546 1546 1547 1547 # We have Int32ArrayType. 1548 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::primitive, constexpr Gigacage::primitiveGigacageMask, JSArrayBufferView::m_vector[t0], t3, t2)1548 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::primitive, constexpr PRIMITIVE_GIGACAGE_MASK, JSArrayBufferView::m_vector[t0], t3, t2) 1549 1549 loadi [t3, t1, 4], t0 1550 1550 finishIntGetByVal(t0, t1) … … 1552 1552 .opGetByValUint32Array: 1553 1553 # We have Uint32ArrayType. 1554 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::primitive, constexpr Gigacage::primitiveGigacageMask, JSArrayBufferView::m_vector[t0], t3, t2)1554 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::primitive, constexpr PRIMITIVE_GIGACAGE_MASK, JSArrayBufferView::m_vector[t0], t3, t2) 1555 1555 # This is the hardest part because of large unsigned values. 1556 1556 loadi [t3, t1, 4], t0 … … 1564 1564 1565 1565 # We have Float64ArrayType. 1566 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::primitive, constexpr Gigacage::primitiveGigacageMask, JSArrayBufferView::m_vector[t0], t3, t2)1566 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::primitive, constexpr PRIMITIVE_GIGACAGE_MASK, JSArrayBufferView::m_vector[t0], t3, t2) 1567 1567 loadd [t3, t1, 8], ft0 1568 1568 bdnequn ft0, ft0, .opGetByValSlow … … 1600 1600 loadConstantOrVariableInt32(size, t0, t3, .opPutByValSlow) 1601 1601 sxi2q t3, t3 1602 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::jsValue, constexpr Gigacage::jsValueGigacageMask, JSObject::m_butterfly[t1], t0, tagTypeNumber)1602 loadCaged(_g_gigacageBasePtrs + Gigacage::BasePtrs::jsValue, constexpr JSVALUE_GIGACAGE_MASK, JSObject::m_butterfly[t1], t0, tagTypeNumber) 1603 1603 move TagTypeNumber, tagTypeNumber 1604 1604 btinz t2, CopyOnWrite, .opPutByValSlow -
trunk/Source/WTF/ChangeLog
r240160 r240171 1 2019-01-18 Matt Lewis <jlewis3@apple.com> 2 3 Unreviewed, rolling out r240160. 4 5 This broke multiple internal builds. 6 7 Reverted changeset: 8 9 "Gigacages should start allocations from a slide" 10 https://bugs.webkit.org/show_bug.cgi?id=193523 11 https://trac.webkit.org/changeset/240160 12 1 13 2019-01-18 Keith Miller <keith_miller@apple.com> 2 14 -
trunk/Source/WTF/wtf/Gigacage.cpp
r240160 r240171 33 33 #if defined(USE_SYSTEM_MALLOC) && USE_SYSTEM_MALLOC 34 34 35 alignas(void*) char g_gigacageBasePtrs[GIGACAGE_BASE_PTRS_SIZE]; 36 35 37 namespace Gigacage { 36 37 alignas(void*) char g_gigacageBasePtrs[gigacageBasePtrsSize];38 38 39 39 void* tryMalloc(Kind, size_t size) … … 62 62 63 63 } // namespace Gigacage 64 #else // defined(USE_SYSTEM_MALLOC) && USE_SYSTEM_MALLOC64 #else 65 65 #include <bmalloc/bmalloc.h> 66 66 -
trunk/Source/WTF/wtf/Gigacage.h
r240160 r240171 27 27 28 28 #include <wtf/FastMalloc.h> 29 #include <wtf/StdLibExtras.h>30 29 31 30 #if defined(USE_SYSTEM_MALLOC) && USE_SYSTEM_MALLOC 32 31 #define GIGACAGE_ENABLED 0 32 #define PRIMITIVE_GIGACAGE_MASK 0 33 #define JSVALUE_GIGACAGE_MASK 0 34 #define GIGACAGE_BASE_PTRS_SIZE 8192 35 36 extern "C" { 37 alignas(void*) extern WTF_EXPORT_PRIVATE char g_gigacageBasePtrs[GIGACAGE_BASE_PTRS_SIZE]; 38 } 33 39 34 40 namespace Gigacage { 35 36 const size_t primitiveGigacageMask = 0;37 const size_t jsValueGigacageMask = 0;38 const size_t gigacageBasePtrsSize = 8 * KB;39 40 extern "C" alignas(void*) WTF_EXPORT_PRIVATE char g_gigacageBasePtrs[gigacageBasePtrsSize];41 41 42 42 struct BasePtrs { -
trunk/Source/bmalloc/ChangeLog
r240160 r240171 1 2019-01-18 Matt Lewis <jlewis3@apple.com> 2 3 Unreviewed, rolling out r240160. 4 5 This broke multiple internal builds. 6 7 Reverted changeset: 8 9 "Gigacages should start allocations from a slide" 10 https://bugs.webkit.org/show_bug.cgi?id=193523 11 https://trac.webkit.org/changeset/240160 12 1 13 2019-01-18 Keith Miller <keith_miller@apple.com> 2 14 -
trunk/Source/bmalloc/bmalloc/Gigacage.cpp
r240160 r240171 36 36 #include <mutex> 37 37 38 #if GIGACAGE_ENABLED39 40 namespace Gigacage {41 42 38 // This is exactly 32GB because inside JSC, indexed accesses for arrays, typed arrays, etc, 43 39 // use unsigned 32-bit ints as indices. The items those indices access are 8 bytes or less … … 45 41 // bounds, the access is guaranteed to land somewhere else in the cage or inside the runway. 46 42 // If this were less than 32GB, those OOB accesses could reach outside of the cage. 47 constexpr size_t gigacageRunway = 32llu * 1024 * 1024 * 1024; 43 #define GIGACAGE_RUNWAY (32llu * 1024 * 1024 * 1024) 48 44 49 45 // Note: g_gigacageBasePtrs[0] is reserved for storing the wasEnabled flag. … … 51 47 // This is done so that the wasEnabled flag will also be protected along with the 52 48 // gigacageBasePtrs. 53 alignas( gigacageBasePtrsSize) char g_gigacageBasePtrs[gigacageBasePtrsSize];49 alignas(GIGACAGE_BASE_PTRS_SIZE) char g_gigacageBasePtrs[GIGACAGE_BASE_PTRS_SIZE]; 54 50 55 51 using namespace bmalloc; 52 53 namespace Gigacage { 56 54 57 55 namespace { … … 64 62 // We might only get page size alignment, but that's also the minimum we need. 65 63 RELEASE_BASSERT(!(basePtrs & (vmPageSize() - 1))); 66 mprotect(g_gigacageBasePtrs, gigacageBasePtrsSize, PROT_READ);64 mprotect(g_gigacageBasePtrs, GIGACAGE_BASE_PTRS_SIZE, PROT_READ); 67 65 } 68 66 69 67 void unprotectGigacageBasePtrs() 70 68 { 71 mprotect(g_gigacageBasePtrs, gigacageBasePtrsSize, PROT_READ | PROT_WRITE);69 mprotect(g_gigacageBasePtrs, GIGACAGE_BASE_PTRS_SIZE, PROT_READ | PROT_WRITE); 72 70 } 73 71 … … 104 102 }; 105 103 104 #if GIGACAGE_ENABLED 106 105 size_t runwaySize(Kind kind) 107 106 { … … 110 109 RELEASE_BASSERT_NOT_REACHED(); 111 110 case Kind::Primitive: 112 return gigacageRunway;111 return static_cast<size_t>(GIGACAGE_RUNWAY); 113 112 case Kind::JSValue: 114 return 0; 115 } 116 return 0; 117 } 113 return static_cast<size_t>(0); 114 } 115 return static_cast<size_t>(0); 116 } 117 #endif 118 118 119 119 } // anonymous namespace … … 121 121 void ensureGigacage() 122 122 { 123 #if GIGACAGE_ENABLED 123 124 static std::once_flag onceFlag; 124 125 std::call_once( … … 189 190 protectGigacageBasePtrs(); 190 191 }); 192 #endif // GIGACAGE_ENABLED 191 193 } 192 194 … … 264 266 { 265 267 static bool cached = false; 268 269 #if GIGACAGE_ENABLED 266 270 static std::once_flag onceFlag; 267 271 std::call_once( … … 285 289 cached = true; 286 290 }); 291 #endif // GIGACAGE_ENABLED 292 287 293 return cached; 288 294 } … … 290 296 } // namespace Gigacage 291 297 292 #endif // GIGACAGE_ENABLED 293 294 298 299 -
trunk/Source/bmalloc/bmalloc/Gigacage.h
r240160 r240171 31 31 #include "BInline.h" 32 32 #include "BPlatform.h" 33 #include "Sizes.h"34 33 #include <cstddef> 35 34 #include <inttypes.h> 36 35 36 #if BCPU(ARM64) 37 #define PRIMITIVE_GIGACAGE_SIZE 0x80000000llu 38 #define JSVALUE_GIGACAGE_SIZE 0x40000000llu 39 #define GIGACAGE_ALLOCATION_CAN_FAIL 1 40 #else 41 #define PRIMITIVE_GIGACAGE_SIZE 0x800000000llu 42 #define JSVALUE_GIGACAGE_SIZE 0x400000000llu 43 #define GIGACAGE_ALLOCATION_CAN_FAIL 0 44 #endif 45 46 // In Linux, if `vm.overcommit_memory = 2` is specified, mmap with large size can fail if it exceeds the size of RAM. 47 // So we specify GIGACAGE_ALLOCATION_CAN_FAIL = 1. 48 #if BOS(LINUX) 49 #undef GIGACAGE_ALLOCATION_CAN_FAIL 50 #define GIGACAGE_ALLOCATION_CAN_FAIL 1 51 #endif 52 53 static_assert(bmalloc::isPowerOfTwo(PRIMITIVE_GIGACAGE_SIZE), ""); 54 static_assert(bmalloc::isPowerOfTwo(JSVALUE_GIGACAGE_SIZE), ""); 55 56 #define GIGACAGE_SIZE_TO_MASK(size) ((size) - 1) 57 58 #define PRIMITIVE_GIGACAGE_MASK GIGACAGE_SIZE_TO_MASK(PRIMITIVE_GIGACAGE_SIZE) 59 #define JSVALUE_GIGACAGE_MASK GIGACAGE_SIZE_TO_MASK(JSVALUE_GIGACAGE_SIZE) 60 37 61 #if ((BOS(DARWIN) || BOS(LINUX)) && \ 38 (BCPU(X86_64) || (BCPU(ARM64) && !defined(__ILP32__) && (!BPLATFORM(IOS_FAMILY) || BPLATFORM(IOS)))))62 (BCPU(X86_64) || (BCPU(ARM64) && !defined(__ILP32__) && (!BPLATFORM(IOS_FAMILY) || BPLATFORM(IOS))))) 39 63 #define GIGACAGE_ENABLED 1 40 64 #else … … 42 66 #endif 43 67 68 #if BCPU(ARM64) 69 #define GIGACAGE_BASE_PTRS_SIZE 16384 70 #else 71 #define GIGACAGE_BASE_PTRS_SIZE 4096 72 #endif 73 74 extern "C" alignas(GIGACAGE_BASE_PTRS_SIZE) BEXPORT char g_gigacageBasePtrs[GIGACAGE_BASE_PTRS_SIZE]; 44 75 45 76 namespace Gigacage { 77 78 BINLINE bool wasEnabled() { return g_gigacageBasePtrs[0]; } 79 BINLINE void setWasEnabled() { g_gigacageBasePtrs[0] = true; } 80 81 struct BasePtrs { 82 uintptr_t reservedForFlags; 83 void* primitive; 84 void* jsValue; 85 }; 46 86 47 87 enum Kind { … … 50 90 JSValue, 51 91 }; 92 93 static_assert(offsetof(BasePtrs, primitive) == Kind::Primitive * sizeof(void*), ""); 94 static_assert(offsetof(BasePtrs, jsValue) == Kind::JSValue * sizeof(void*), ""); 95 96 static constexpr unsigned numKinds = 2; 97 98 BEXPORT void ensureGigacage(); 99 100 BEXPORT void disablePrimitiveGigacage(); 101 102 // This will call the disable callback immediately if the Primitive Gigacage is currently disabled. 103 BEXPORT void addPrimitiveDisableCallback(void (*)(void*), void*); 104 BEXPORT void removePrimitiveDisableCallback(void (*)(void*), void*); 105 106 BEXPORT void disableDisablingPrimitiveGigacageIfShouldBeEnabled(); 107 108 BEXPORT bool isDisablingPrimitiveGigacageDisabled(); 109 inline bool isPrimitiveGigacagePermanentlyEnabled() { return isDisablingPrimitiveGigacageDisabled(); } 110 inline bool canPrimitiveGigacageBeDisabled() { return !isDisablingPrimitiveGigacageDisabled(); } 52 111 53 112 BINLINE const char* name(Kind kind) … … 65 124 } 66 125 67 #if GIGACAGE_ENABLED68 69 #if BCPU(ARM64)70 constexpr size_t primitiveGigacageSize = 2 * bmalloc::Sizes::GB;71 constexpr size_t jsValueGigacageSize = 1 * bmalloc::Sizes::GB;72 constexpr size_t gigacageBasePtrsSize = 16 * bmalloc::Sizes::kB;73 constexpr size_t minimumCageSizeAfterSlide = bmalloc::Sizes::GB / 2;74 #define GIGACAGE_ALLOCATION_CAN_FAIL 175 #else76 constexpr size_t primitiveGigacageSize = 32 * bmalloc::Sizes::GB;77 constexpr size_t jsValueGigacageSize = 16 * bmalloc::Sizes::GB;78 constexpr size_t gigacageBasePtrsSize = 4 * bmalloc::Sizes::kB;79 constexpr size_t minimumCageSizeAfterSlide = 4 * bmalloc::Sizes::GB;80 #define GIGACAGE_ALLOCATION_CAN_FAIL 081 #endif82 83 // In Linux, if `vm.overcommit_memory = 2` is specified, mmap with large size can fail if it exceeds the size of RAM.84 // So we specify GIGACAGE_ALLOCATION_CAN_FAIL = 1.85 #if BOS(LINUX)86 #undef GIGACAGE_ALLOCATION_CAN_FAIL87 #define GIGACAGE_ALLOCATION_CAN_FAIL 188 #endif89 90 91 static_assert(bmalloc::isPowerOfTwo(primitiveGigacageSize), "");92 static_assert(bmalloc::isPowerOfTwo(jsValueGigacageSize), "");93 static_assert(primitiveGigacageSize > minimumCageSizeAfterSlide, "");94 static_assert(jsValueGigacageSize > minimumCageSizeAfterSlide, "");95 96 constexpr size_t gigacageSizeToMask(size_t size) { return size - 1; }97 98 constexpr size_t primitiveGigacageMask = gigacageSizeToMask(primitiveGigacageSize);99 constexpr size_t jsValueGigacageMask = gigacageSizeToMask(jsValueGigacageSize);100 101 extern "C" alignas(gigacageBasePtrsSize) BEXPORT char g_gigacageBasePtrs[gigacageBasePtrsSize];102 103 BINLINE bool wasEnabled() { return g_gigacageBasePtrs[0]; }104 BINLINE void setWasEnabled() { g_gigacageBasePtrs[0] = true; }105 106 struct BasePtrs {107 uintptr_t reservedForFlags;108 void* primitive;109 void* jsValue;110 };111 112 static_assert(offsetof(BasePtrs, primitive) == Kind::Primitive * sizeof(void*), "");113 static_assert(offsetof(BasePtrs, jsValue) == Kind::JSValue * sizeof(void*), "");114 115 constexpr unsigned numKinds = 2;116 117 BEXPORT void ensureGigacage();118 119 BEXPORT void disablePrimitiveGigacage();120 121 // This will call the disable callback immediately if the Primitive Gigacage is currently disabled.122 BEXPORT void addPrimitiveDisableCallback(void (*)(void*), void*);123 BEXPORT void removePrimitiveDisableCallback(void (*)(void*), void*);124 125 BEXPORT void disableDisablingPrimitiveGigacageIfShouldBeEnabled();126 127 BEXPORT bool isDisablingPrimitiveGigacageDisabled();128 inline bool isPrimitiveGigacagePermanentlyEnabled() { return isDisablingPrimitiveGigacageDisabled(); }129 inline bool canPrimitiveGigacageBeDisabled() { return !isDisablingPrimitiveGigacageDisabled(); }130 131 126 BINLINE void*& basePtr(BasePtrs& basePtrs, Kind kind) 132 127 { … … 164 159 RELEASE_BASSERT_NOT_REACHED(); 165 160 case Primitive: 166 return static_cast<size_t>( primitiveGigacageSize);161 return static_cast<size_t>(PRIMITIVE_GIGACAGE_SIZE); 167 162 case JSValue: 168 return static_cast<size_t>( jsValueGigacageSize);163 return static_cast<size_t>(JSVALUE_GIGACAGE_SIZE); 169 164 } 170 165 BCRASH(); … … 179 174 BINLINE size_t mask(Kind kind) 180 175 { 181 return gigacageSizeToMask(size(kind));176 return GIGACAGE_SIZE_TO_MASK(size(kind)); 182 177 } 183 178 … … 208 203 BEXPORT bool shouldBeEnabled(); 209 204 210 #else // GIGACAGE_ENABLED211 212 BINLINE void*& basePtr(Kind)213 {214 BCRASH();215 static void* unreachable;216 return unreachable;217 }218 BINLINE size_t size(Kind) { BCRASH(); return 0; }219 BINLINE void ensureGigacage() { }220 BINLINE bool wasEnabled() { return false; }221 BINLINE bool isCaged(Kind, const void*) { return true; }222 template<typename T> BINLINE T* caged(Kind, T* ptr) { return ptr; }223 BINLINE void disableDisablingPrimitiveGigacageIfShouldBeEnabled() { }224 BINLINE void disablePrimitiveGigacage() { }225 BINLINE void addPrimitiveDisableCallback(void (*)(void*), void*) { }226 BINLINE void removePrimitiveDisableCallback(void (*)(void*), void*) { }227 228 #endif // GIGACAGE_ENABLED229 230 205 } // namespace Gigacage 231 206 232 207 233 -
trunk/Source/bmalloc/bmalloc/Heap.cpp
r240160 r240171 30 30 #include "BumpAllocator.h" 31 31 #include "Chunk.h" 32 #include "CryptoRandom.h"33 32 #include "Environment.h" 34 33 #include "Gigacage.h" … … 63 62 if (usingGigacage()) { 64 63 RELEASE_BASSERT(gigacageBasePtr()); 65 uint64_t random; 66 cryptoRandom(reinterpret_cast<unsigned char*>(&random), sizeof(random)); 67 ptrdiff_t offset = random % (gigacageSize() - Gigacage::minimumCageSizeAfterSlide); 68 offset = reinterpret_cast<ptrdiff_t>(roundDownToMultipleOf(vmPageSize(), reinterpret_cast<void*>(offset))); 69 void* base = reinterpret_cast<unsigned char*>(gigacageBasePtr()) + offset; 70 m_largeFree.add(LargeRange(base, gigacageSize() - offset, 0, 0)); 64 m_largeFree.add(LargeRange(gigacageBasePtr(), gigacageSize(), 0, 0)); 71 65 } 72 66 #endif -
trunk/Source/bmalloc/bmalloc/Sizes.h
r240160 r240171 41 41 42 42 namespace Sizes { 43 static constexpr size_t kB = 1024; 44 static constexpr size_t MB = kB * kB; 45 static constexpr size_t GB = kB * kB * kB; 43 static const size_t kB = 1024; 44 static const size_t MB = kB * kB; 46 45 47 static constexprsize_t alignment = 8;48 static constexprsize_t alignmentMask = alignment - 1ul;46 static const size_t alignment = 8; 47 static const size_t alignmentMask = alignment - 1ul; 49 48 50 static constexprsize_t chunkSize = 1 * MB;51 static constexprsize_t chunkMask = ~(chunkSize - 1ul);49 static const size_t chunkSize = 1 * MB; 50 static const size_t chunkMask = ~(chunkSize - 1ul); 52 51 53 static constexprsize_t smallLineSize = 256;54 static constexprsize_t smallPageSize = 4 * kB;55 static constexprsize_t smallPageLineCount = smallPageSize / smallLineSize;52 static const size_t smallLineSize = 256; 53 static const size_t smallPageSize = 4 * kB; 54 static const size_t smallPageLineCount = smallPageSize / smallLineSize; 56 55 57 static constexprsize_t maskSizeClassMax = 512;58 static constexprsize_t smallMax = 32 * kB;56 static const size_t maskSizeClassMax = 512; 57 static const size_t smallMax = 32 * kB; 59 58 60 static constexprsize_t pageSizeMax = smallMax * 2;61 static constexprsize_t pageClassCount = pageSizeMax / smallPageSize;59 static const size_t pageSizeMax = smallMax * 2; 60 static const size_t pageClassCount = pageSizeMax / smallPageSize; 62 61 63 static constexprsize_t pageSizeWasteFactor = 8;64 static constexprsize_t logWasteFactor = 8;62 static const size_t pageSizeWasteFactor = 8; 63 static const size_t logWasteFactor = 8; 65 64 66 static constexprsize_t largeAlignment = smallMax / pageSizeWasteFactor;67 static constexprsize_t largeAlignmentMask = largeAlignment - 1;65 static const size_t largeAlignment = smallMax / pageSizeWasteFactor; 66 static const size_t largeAlignmentMask = largeAlignment - 1; 68 67 69 static constexpr size_t deallocatorLogCapacity = 512; 70 static constexpr size_t bumpRangeCacheCapacity = 3; 68 static const size_t deallocatorLogCapacity = 512; 69 static const size_t bumpRangeCacheCapacity = 3; 70 71 static const size_t scavengerBytesPerMemoryPressureCheck = 16 * MB; 72 static const double memoryPressureThreshold = 0.75; 73 74 static const size_t maskSizeClassCount = maskSizeClassMax / alignment; 71 75 72 static constexpr size_t scavengerBytesPerMemoryPressureCheck = 16 * MB; 73 static constexpr double memoryPressureThreshold = 0.75; 76 constexpr size_t maskSizeClass(size_t size) 77 { 78 // We mask to accommodate zero. 79 return mask((size - 1) / alignment, maskSizeClassCount - 1); 80 } 74 81 75 static constexpr size_t maskSizeClassCount = maskSizeClassMax / alignment; 82 inline size_t maskObjectSize(size_t maskSizeClass) 83 { 84 return (maskSizeClass + 1) * alignment; 85 } 76 86 77 constexpr size_t maskSizeClass(size_t size) 78 { 79 // We mask to accommodate zero. 80 return mask((size - 1) / alignment, maskSizeClassCount - 1); 87 static const size_t logAlignmentMin = maskSizeClassMax / logWasteFactor; 88 89 static const size_t logSizeClassCount = (log2(smallMax) - log2(maskSizeClassMax)) * logWasteFactor; 90 91 inline size_t logSizeClass(size_t size) 92 { 93 size_t base = log2(size - 1) - log2(maskSizeClassMax); 94 size_t offset = (size - 1 - (maskSizeClassMax << base)); 95 return base * logWasteFactor + offset / (logAlignmentMin << base); 96 } 97 98 inline size_t logObjectSize(size_t logSizeClass) 99 { 100 size_t base = logSizeClass / logWasteFactor; 101 size_t offset = logSizeClass % logWasteFactor; 102 return (maskSizeClassMax << base) + (offset + 1) * (logAlignmentMin << base); 103 } 104 105 static const size_t sizeClassCount = maskSizeClassCount + logSizeClassCount; 106 107 inline size_t sizeClass(size_t size) 108 { 109 if (size <= maskSizeClassMax) 110 return maskSizeClass(size); 111 return maskSizeClassCount + logSizeClass(size); 112 } 113 114 inline size_t objectSize(size_t sizeClass) 115 { 116 if (sizeClass < maskSizeClassCount) 117 return maskObjectSize(sizeClass); 118 return logObjectSize(sizeClass - maskSizeClassCount); 119 } 120 121 inline size_t pageSize(size_t pageClass) 122 { 123 return (pageClass + 1) * smallPageSize; 124 } 81 125 } 82 83 inline size_t maskObjectSize(size_t maskSizeClass)84 {85 return (maskSizeClass + 1) * alignment;86 }87 88 static constexpr size_t logAlignmentMin = maskSizeClassMax / logWasteFactor;89 90 static constexpr size_t logSizeClassCount = (log2(smallMax) - log2(maskSizeClassMax)) * logWasteFactor;91 92 inline size_t logSizeClass(size_t size)93 {94 size_t base = log2(size - 1) - log2(maskSizeClassMax);95 size_t offset = (size - 1 - (maskSizeClassMax << base));96 return base * logWasteFactor + offset / (logAlignmentMin << base);97 }98 99 inline size_t logObjectSize(size_t logSizeClass)100 {101 size_t base = logSizeClass / logWasteFactor;102 size_t offset = logSizeClass % logWasteFactor;103 return (maskSizeClassMax << base) + (offset + 1) * (logAlignmentMin << base);104 }105 106 static constexpr size_t sizeClassCount = maskSizeClassCount + logSizeClassCount;107 108 inline size_t sizeClass(size_t size)109 {110 if (size <= maskSizeClassMax)111 return maskSizeClass(size);112 return maskSizeClassCount + logSizeClass(size);113 }114 115 inline size_t objectSize(size_t sizeClass)116 {117 if (sizeClass < maskSizeClassCount)118 return maskObjectSize(sizeClass);119 return logObjectSize(sizeClass - maskSizeClassCount);120 }121 122 inline size_t pageSize(size_t pageClass)123 {124 return (pageClass + 1) * smallPageSize;125 }126 } // namespace Sizes127 126 128 127 using namespace Sizes;
Note: See TracChangeset
for help on using the changeset viewer.