diff options
author | 2016-02-02 15:22:09 -0800 | |
---|---|---|
committer | 2016-02-05 12:12:44 -0800 | |
commit | 7ed9c561048d79083b6d0576c71a986a3123bca6 (patch) | |
tree | 8e352f05dc5e82126dd61e0e8e6ddb2a1003e16a | |
parent | c3cf1d2e35a45bd2e2c60fbc9c2a1a6a56dfc529 (diff) |
Use 8-byte increment bracket sizes for rosalloc thread local runs.
Very small space savings (< 1%) after device boot and up to 10%
allocation speedup.
Some minor cleanup.
Bug: 9986565
Change-Id: I51d791c4674d6944fe9a7ee78537ac3490c1a02c
-rw-r--r-- | runtime/asm_support.h | 22 | ||||
-rw-r--r-- | runtime/entrypoints_order_test.cc | 2 | ||||
-rw-r--r-- | runtime/gc/allocator/rosalloc-inl.h | 5 | ||||
-rw-r--r-- | runtime/gc/allocator/rosalloc.cc | 56 | ||||
-rw-r--r-- | runtime/gc/allocator/rosalloc.h | 126 | ||||
-rw-r--r-- | runtime/thread.cc | 2 | ||||
-rw-r--r-- | runtime/thread.h | 5 |
7 files changed, 122 insertions, 96 deletions
diff --git a/runtime/asm_support.h b/runtime/asm_support.h index 31610a3d71..eb3b7f3538 100644 --- a/runtime/asm_support.h +++ b/runtime/asm_support.h @@ -150,11 +150,11 @@ ADD_TEST_EQ(THREAD_ALT_IBASE_OFFSET, ADD_TEST_EQ(THREAD_ROSALLOC_RUNS_OFFSET, art::Thread::RosAllocRunsOffset<__SIZEOF_POINTER__>().Int32Value()) // Offset of field Thread::tlsPtr_.thread_local_alloc_stack_top. -#define THREAD_LOCAL_ALLOC_STACK_TOP_OFFSET (THREAD_ROSALLOC_RUNS_OFFSET + 34 * __SIZEOF_POINTER__) +#define THREAD_LOCAL_ALLOC_STACK_TOP_OFFSET (THREAD_ROSALLOC_RUNS_OFFSET + 16 * __SIZEOF_POINTER__) ADD_TEST_EQ(THREAD_LOCAL_ALLOC_STACK_TOP_OFFSET, art::Thread::ThreadLocalAllocStackTopOffset<__SIZEOF_POINTER__>().Int32Value()) // Offset of field Thread::tlsPtr_.thread_local_alloc_stack_end. -#define THREAD_LOCAL_ALLOC_STACK_END_OFFSET (THREAD_ROSALLOC_RUNS_OFFSET + 35 * __SIZEOF_POINTER__) +#define THREAD_LOCAL_ALLOC_STACK_END_OFFSET (THREAD_ROSALLOC_RUNS_OFFSET + 17 * __SIZEOF_POINTER__) ADD_TEST_EQ(THREAD_LOCAL_ALLOC_STACK_END_OFFSET, art::Thread::ThreadLocalAllocStackEndOffset<__SIZEOF_POINTER__>().Int32Value()) @@ -331,21 +331,23 @@ ADD_TEST_EQ(static_cast<uint32_t>(OBJECT_ALIGNMENT_MASK_TOGGLED), ADD_TEST_EQ(ROSALLOC_MAX_THREAD_LOCAL_BRACKET_SIZE, static_cast<int32_t>(art::gc::allocator::RosAlloc::kMaxThreadLocalBracketSize)) -#define ROSALLOC_BRACKET_QUANTUM_SIZE_SHIFT 4 +#define ROSALLOC_BRACKET_QUANTUM_SIZE_SHIFT 3 ADD_TEST_EQ(ROSALLOC_BRACKET_QUANTUM_SIZE_SHIFT, - static_cast<int32_t>(art::gc::allocator::RosAlloc::kBracketQuantumSizeShift)) + static_cast<int32_t>(art::gc::allocator::RosAlloc::kThreadLocalBracketQuantumSizeShift)) -#define ROSALLOC_BRACKET_QUANTUM_SIZE_MASK 15 +#define ROSALLOC_BRACKET_QUANTUM_SIZE_MASK 7 ADD_TEST_EQ(ROSALLOC_BRACKET_QUANTUM_SIZE_MASK, - static_cast<int32_t>(art::gc::allocator::RosAlloc::kBracketQuantumSize - 1)) + static_cast<int32_t>(art::gc::allocator::RosAlloc::kThreadLocalBracketQuantumSize - 1)) -#define ROSALLOC_BRACKET_QUANTUM_SIZE_MASK_TOGGLED32 0xfffffff0 +#define ROSALLOC_BRACKET_QUANTUM_SIZE_MASK_TOGGLED32 0xfffffff8 ADD_TEST_EQ(static_cast<uint32_t>(ROSALLOC_BRACKET_QUANTUM_SIZE_MASK_TOGGLED32), - ~static_cast<uint32_t>(art::gc::allocator::RosAlloc::kBracketQuantumSize - 1)) + ~static_cast<uint32_t>( + art::gc::allocator::RosAlloc::kThreadLocalBracketQuantumSize - 1)) -#define ROSALLOC_BRACKET_QUANTUM_SIZE_MASK_TOGGLED64 0xfffffffffffffff0 +#define ROSALLOC_BRACKET_QUANTUM_SIZE_MASK_TOGGLED64 0xfffffffffffffff8 ADD_TEST_EQ(static_cast<uint64_t>(ROSALLOC_BRACKET_QUANTUM_SIZE_MASK_TOGGLED64), - ~static_cast<uint64_t>(art::gc::allocator::RosAlloc::kBracketQuantumSize - 1)) + ~static_cast<uint64_t>( + art::gc::allocator::RosAlloc::kThreadLocalBracketQuantumSize - 1)) #define ROSALLOC_RUN_FREE_LIST_OFFSET 8 ADD_TEST_EQ(ROSALLOC_RUN_FREE_LIST_OFFSET, diff --git a/runtime/entrypoints_order_test.cc b/runtime/entrypoints_order_test.cc index f87d48de54..e72809b297 100644 --- a/runtime/entrypoints_order_test.cc +++ b/runtime/entrypoints_order_test.cc @@ -127,7 +127,7 @@ class EntrypointsOrderTest : public CommonRuntimeTest { EXPECT_OFFSET_DIFFP(Thread, tlsPtr_, mterp_default_ibase, mterp_alt_ibase, sizeof(void*)); EXPECT_OFFSET_DIFFP(Thread, tlsPtr_, mterp_alt_ibase, rosalloc_runs, sizeof(void*)); EXPECT_OFFSET_DIFFP(Thread, tlsPtr_, rosalloc_runs, thread_local_alloc_stack_top, - sizeof(void*) * kNumRosAllocThreadLocalSizeBrackets); + sizeof(void*) * kNumRosAllocThreadLocalSizeBracketsInThread); EXPECT_OFFSET_DIFFP(Thread, tlsPtr_, thread_local_alloc_stack_top, thread_local_alloc_stack_end, sizeof(void*)); EXPECT_OFFSET_DIFFP(Thread, tlsPtr_, thread_local_alloc_stack_end, held_mutexes, sizeof(void*)); diff --git a/runtime/gc/allocator/rosalloc-inl.h b/runtime/gc/allocator/rosalloc-inl.h index 2510514c04..d1c81e3aba 100644 --- a/runtime/gc/allocator/rosalloc-inl.h +++ b/runtime/gc/allocator/rosalloc-inl.h @@ -62,11 +62,6 @@ inline bool RosAlloc::CanAllocFromThreadLocalRun(Thread* self, size_t size) { } size_t bracket_size; size_t idx = SizeToIndexAndBracketSize(size, &bracket_size); - DCHECK_EQ(idx, SizeToIndex(size)); - DCHECK_EQ(bracket_size, IndexToBracketSize(idx)); - DCHECK_EQ(bracket_size, bracketSizes[idx]); - DCHECK_LE(size, bracket_size); - DCHECK(size > 512 || bracket_size - size < 16); DCHECK_LT(idx, kNumThreadLocalSizeBrackets); Run* thread_local_run = reinterpret_cast<Run*>(self->GetRosAllocRun(idx)); if (kIsDebugBuild) { diff --git a/runtime/gc/allocator/rosalloc.cc b/runtime/gc/allocator/rosalloc.cc index 7d00094c9f..8b125dd167 100644 --- a/runtime/gc/allocator/rosalloc.cc +++ b/runtime/gc/allocator/rosalloc.cc @@ -638,11 +638,6 @@ void* RosAlloc::AllocFromRunThreadUnsafe(Thread* self, size_t size, size_t* byte DCHECK_LE(size, kLargeSizeThreshold); size_t bracket_size; size_t idx = SizeToIndexAndBracketSize(size, &bracket_size); - DCHECK_EQ(idx, SizeToIndex(size)); - DCHECK_EQ(bracket_size, IndexToBracketSize(idx)); - DCHECK_EQ(bracket_size, bracketSizes[idx]); - DCHECK_LE(size, bracket_size); - DCHECK(size > 512 || bracket_size - size < 16); Locks::mutator_lock_->AssertExclusiveHeld(self); void* slot_addr = AllocFromCurrentRunUnlocked(self, idx); if (LIKELY(slot_addr != nullptr)) { @@ -662,14 +657,7 @@ void* RosAlloc::AllocFromRun(Thread* self, size_t size, size_t* bytes_allocated, DCHECK_LE(size, kLargeSizeThreshold); size_t bracket_size; size_t idx = SizeToIndexAndBracketSize(size, &bracket_size); - DCHECK_EQ(idx, SizeToIndex(size)); - DCHECK_EQ(bracket_size, IndexToBracketSize(idx)); - DCHECK_EQ(bracket_size, bracketSizes[idx]); - DCHECK_LE(size, bracket_size); - DCHECK(size > 512 || bracket_size - size < 16); - void* slot_addr; - if (LIKELY(idx < kNumThreadLocalSizeBrackets)) { // Use a thread-local run. Run* thread_local_run = reinterpret_cast<Run*>(self->GetRosAllocRun(idx)); @@ -881,17 +869,6 @@ std::string RosAlloc::Run::Dump() { return stream.str(); } -inline size_t RosAlloc::Run::SlotIndex(Slot* slot) { - const uint8_t idx = size_bracket_idx_; - const size_t bracket_size = bracketSizes[idx]; - const size_t offset_from_slot_base = reinterpret_cast<uint8_t*>(slot) - - reinterpret_cast<uint8_t*>(FirstSlot()); - DCHECK_EQ(offset_from_slot_base % bracket_size, static_cast<size_t>(0)); - size_t slot_idx = offset_from_slot_base / bracket_size; - DCHECK_LT(slot_idx, numOfSlots[idx]); - return slot_idx; -} - void RosAlloc::Run::FreeSlot(void* ptr) { DCHECK(!IsThreadLocal()); const uint8_t idx = size_bracket_idx_; @@ -1647,9 +1624,14 @@ void RosAlloc::AssertAllThreadLocalRunsAreRevoked() { void RosAlloc::Initialize() { // bracketSizes. + static_assert(kNumRegularSizeBrackets == kNumOfSizeBrackets - 2, + "There should be two non-regular brackets"); for (size_t i = 0; i < kNumOfSizeBrackets; i++) { - if (i < kNumOfSizeBrackets - 2) { - bracketSizes[i] = 16 * (i + 1); + if (i < kNumThreadLocalSizeBrackets) { + bracketSizes[i] = kThreadLocalBracketQuantumSize * (i + 1); + } else if (i < kNumRegularSizeBrackets) { + bracketSizes[i] = kBracketQuantumSize * (i - kNumThreadLocalSizeBrackets + 1) + + (kThreadLocalBracketQuantumSize * kNumThreadLocalSizeBrackets); } else if (i == kNumOfSizeBrackets - 2) { bracketSizes[i] = 1 * KB; } else { @@ -1662,16 +1644,13 @@ void RosAlloc::Initialize() { } // numOfPages. for (size_t i = 0; i < kNumOfSizeBrackets; i++) { - if (i < 4) { + if (i < kNumThreadLocalSizeBrackets) { numOfPages[i] = 1; - } else if (i < 8) { - numOfPages[i] = 1; - } else if (i < 16) { + } else if (i < (kNumThreadLocalSizeBrackets + kNumRegularSizeBrackets) / 2) { numOfPages[i] = 4; - } else if (i < 32) { + } else if (i < kNumRegularSizeBrackets) { numOfPages[i] = 8; - } else if (i == 32) { - DCHECK_EQ(i, kNumOfSizeBrackets - 2); + } else if (i == kNumOfSizeBrackets - 2) { numOfPages[i] = 16; } else { DCHECK_EQ(i, kNumOfSizeBrackets - 1); @@ -1701,8 +1680,8 @@ void RosAlloc::Initialize() { size_t tmp_header_size = (tmp_unaligned_header_size % bracket_size == 0) ? tmp_unaligned_header_size : tmp_unaligned_header_size + (bracket_size - tmp_unaligned_header_size % bracket_size); - DCHECK_EQ(tmp_header_size % bracket_size, static_cast<size_t>(0)); - DCHECK_EQ(tmp_header_size % 8, static_cast<size_t>(0)); + DCHECK_EQ(tmp_header_size % bracket_size, 0U); + DCHECK_EQ(tmp_header_size % sizeof(uint64_t), 0U); if (tmp_slots_size + tmp_header_size <= run_size) { // Found the right number of slots, that is, there was enough // space for the header (including the bit maps.) @@ -1711,8 +1690,8 @@ void RosAlloc::Initialize() { break; } } - DCHECK_GT(num_of_slots, 0U); - DCHECK_GT(header_size, 0U); + DCHECK_GT(num_of_slots, 0U) << i; + DCHECK_GT(header_size, 0U) << i; // Add the padding for the alignment remainder. header_size += run_size % bracket_size; DCHECK_EQ(header_size + num_of_slots * bracket_size, run_size); @@ -1723,7 +1702,7 @@ void RosAlloc::Initialize() { << ", headerSizes[" << i << "]=" << headerSizes[i]; } } - // Fill the alloc bitmap so nobody can successfully allocate from it. + // Set up the dedicated full run so that nobody can successfully allocate from it. if (kIsDebugBuild) { dedicated_full_run_->magic_num_ = kMagicNum; } @@ -1735,6 +1714,9 @@ void RosAlloc::Initialize() { // The smallest bracket size must be at least as large as the sizeof(Slot). DCHECK_LE(sizeof(Slot), bracketSizes[0]) << "sizeof(Slot) <= the smallest bracket size"; + // Check the invariants between the max bracket sizes and the number of brackets. + DCHECK_EQ(kMaxThreadLocalBracketSize, bracketSizes[kNumThreadLocalSizeBrackets - 1]); + DCHECK_EQ(kMaxRegularBracketSize, bracketSizes[kNumRegularSizeBrackets - 1]); } void RosAlloc::BytesAllocatedCallback(void* start ATTRIBUTE_UNUSED, void* end ATTRIBUTE_UNUSED, diff --git a/runtime/gc/allocator/rosalloc.h b/runtime/gc/allocator/rosalloc.h index 3ce3d634f5..a472a8bffb 100644 --- a/runtime/gc/allocator/rosalloc.h +++ b/runtime/gc/allocator/rosalloc.h @@ -366,7 +366,7 @@ class RosAlloc { static size_t fixed_header_size() { return sizeof(Run); } - Slot* FirstSlot() { + Slot* FirstSlot() const { const uint8_t idx = size_bracket_idx_; return reinterpret_cast<Slot*>(reinterpret_cast<uintptr_t>(this) + headerSizes[idx]); } @@ -473,7 +473,16 @@ class RosAlloc { DCHECK_LT(slot_idx, numOfSlots[idx]); return reinterpret_cast<Slot*>(ptr); } - size_t SlotIndex(Slot* slot); + size_t SlotIndex(Slot* slot) const { + const uint8_t idx = size_bracket_idx_; + const size_t bracket_size = bracketSizes[idx]; + const size_t offset_from_slot_base = reinterpret_cast<uint8_t*>(slot) + - reinterpret_cast<uint8_t*>(FirstSlot()); + DCHECK_EQ(offset_from_slot_base % bracket_size, 0U); + size_t slot_idx = offset_from_slot_base / bracket_size; + DCHECK_LT(slot_idx, numOfSlots[idx]); + return slot_idx; + } // TODO: DISALLOW_COPY_AND_ASSIGN(Run); }; @@ -482,10 +491,8 @@ class RosAlloc { static constexpr uint8_t kMagicNum = 42; // The magic number for free pages. static constexpr uint8_t kMagicNumFree = 43; - // The number of size brackets. Sync this with the length of Thread::rosalloc_runs_. - static constexpr size_t kNumOfSizeBrackets = kNumRosAllocThreadLocalSizeBrackets; - // The number of smaller size brackets that are the quantum size apart. - static constexpr size_t kNumOfQuantumSizeBrackets = 32; + // The number of size brackets. + static constexpr size_t kNumOfSizeBrackets = 42; // The sizes (the slot sizes, in bytes) of the size brackets. static size_t bracketSizes[kNumOfSizeBrackets]; // The numbers of pages that are used for runs for each size bracket. @@ -506,16 +513,23 @@ class RosAlloc { } // Returns the index of the size bracket from the bracket size. static size_t BracketSizeToIndex(size_t size) { - DCHECK(16 <= size && ((size < 1 * KB && size % 16 == 0) || size == 1 * KB || size == 2 * KB)); + DCHECK(8 <= size && + ((size <= kMaxThreadLocalBracketSize && size % kThreadLocalBracketQuantumSize == 0) || + (size <= kMaxRegularBracketSize && size % kBracketQuantumSize == 0) || + size == 1 * KB || size == 2 * KB)); size_t idx; if (UNLIKELY(size == 1 * KB)) { idx = kNumOfSizeBrackets - 2; } else if (UNLIKELY(size == 2 * KB)) { idx = kNumOfSizeBrackets - 1; + } else if (LIKELY(size <= kMaxThreadLocalBracketSize)) { + DCHECK_EQ(size % kThreadLocalBracketQuantumSize, 0U); + idx = size / kThreadLocalBracketQuantumSize - 1; } else { - DCHECK(size < 1 * KB); - DCHECK_EQ(size % 16, static_cast<size_t>(0)); - idx = size / 16 - 1; + DCHECK(size <= kMaxRegularBracketSize); + DCHECK_EQ((size - kMaxThreadLocalBracketSize) % kBracketQuantumSize, 0U); + idx = ((size - kMaxThreadLocalBracketSize) / kBracketQuantumSize - 1) + + kNumThreadLocalSizeBrackets; } DCHECK(bracketSizes[idx] == size); return idx; @@ -530,51 +544,64 @@ class RosAlloc { // Rounds up the size up the nearest bracket size. static size_t RoundToBracketSize(size_t size) { DCHECK(size <= kLargeSizeThreshold); - if (LIKELY(size <= 512)) { - return RoundUp(size, 16); - } else if (512 < size && size <= 1 * KB) { + if (LIKELY(size <= kMaxThreadLocalBracketSize)) { + return RoundUp(size, kThreadLocalBracketQuantumSize); + } else if (size <= kMaxRegularBracketSize) { + return RoundUp(size, kBracketQuantumSize); + } else if (UNLIKELY(size <= 1 * KB)) { return 1 * KB; } else { - DCHECK(1 * KB < size && size <= 2 * KB); + DCHECK_LE(size, 2 * KB); return 2 * KB; } } // Returns the size bracket index from the byte size with rounding. static size_t SizeToIndex(size_t size) { DCHECK(size <= kLargeSizeThreshold); - if (LIKELY(size <= 512)) { - return RoundUp(size, 16) / 16 - 1; - } else if (512 < size && size <= 1 * KB) { + if (LIKELY(size <= kMaxThreadLocalBracketSize)) { + return RoundUp(size, kThreadLocalBracketQuantumSize) / kThreadLocalBracketQuantumSize - 1; + } else if (size <= kMaxRegularBracketSize) { + return (RoundUp(size, kBracketQuantumSize) - kMaxThreadLocalBracketSize) / kBracketQuantumSize + - 1 + kNumThreadLocalSizeBrackets; + } else if (size <= 1 * KB) { return kNumOfSizeBrackets - 2; } else { - DCHECK(1 * KB < size && size <= 2 * KB); + DCHECK_LE(size, 2 * KB); return kNumOfSizeBrackets - 1; } } // A combination of SizeToIndex() and RoundToBracketSize(). static size_t SizeToIndexAndBracketSize(size_t size, size_t* bracket_size_out) { DCHECK(size <= kLargeSizeThreshold); - if (LIKELY(size <= 512)) { - size_t bracket_size = RoundUp(size, 16); - *bracket_size_out = bracket_size; - size_t idx = bracket_size / 16 - 1; - DCHECK_EQ(bracket_size, IndexToBracketSize(idx)); - return idx; - } else if (512 < size && size <= 1 * KB) { - size_t bracket_size = 1024; - *bracket_size_out = bracket_size; - size_t idx = kNumOfSizeBrackets - 2; - DCHECK_EQ(bracket_size, IndexToBracketSize(idx)); - return idx; + size_t idx; + size_t bracket_size; + if (LIKELY(size <= kMaxThreadLocalBracketSize)) { + bracket_size = RoundUp(size, kThreadLocalBracketQuantumSize); + idx = bracket_size / kThreadLocalBracketQuantumSize - 1; + } else if (size <= kMaxRegularBracketSize) { + bracket_size = RoundUp(size, kBracketQuantumSize); + idx = ((bracket_size - kMaxThreadLocalBracketSize) / kBracketQuantumSize - 1) + + kNumThreadLocalSizeBrackets; + } else if (size <= 1 * KB) { + bracket_size = 1 * KB; + idx = kNumOfSizeBrackets - 2; } else { - DCHECK(1 * KB < size && size <= 2 * KB); - size_t bracket_size = 2048; - *bracket_size_out = bracket_size; - size_t idx = kNumOfSizeBrackets - 1; - DCHECK_EQ(bracket_size, IndexToBracketSize(idx)); - return idx; + DCHECK(size <= 2 * KB); + bracket_size = 2 * KB; + idx = kNumOfSizeBrackets - 1; } + DCHECK_EQ(idx, SizeToIndex(size)) << idx; + DCHECK_EQ(bracket_size, IndexToBracketSize(idx)) << idx; + DCHECK_EQ(bracket_size, bracketSizes[idx]) << idx; + DCHECK_LE(size, bracket_size) << idx; + DCHECK(size > kMaxRegularBracketSize || + (size <= kMaxThreadLocalBracketSize && + bracket_size - size < kThreadLocalBracketQuantumSize) || + (size <= kMaxRegularBracketSize && bracket_size - size < kBracketQuantumSize)) << idx; + *bracket_size_out = bracket_size; + return idx; } + // Returns the page map index from an address. Requires that the // address is page size aligned. size_t ToPageMapIndex(const void* addr) const { @@ -630,18 +657,37 @@ class RosAlloc { // The default value for page_release_size_threshold_. static constexpr size_t kDefaultPageReleaseSizeThreshold = 4 * MB; - // We use thread-local runs for the size Brackets whose indexes + // We use thread-local runs for the size brackets whose indexes // are less than this index. We use shared (current) runs for the rest. - static const size_t kNumThreadLocalSizeBrackets = 8; + // Sync this with the length of Thread::rosalloc_runs_. + static const size_t kNumThreadLocalSizeBrackets = 16; + static_assert(kNumThreadLocalSizeBrackets == kNumRosAllocThreadLocalSizeBracketsInThread, + "Mismatch between kNumThreadLocalSizeBrackets and " + "kNumRosAllocThreadLocalSizeBracketsInThread"); // The size of the largest bracket we use thread-local runs for. // This should be equal to bracketSizes[kNumThreadLocalSizeBrackets - 1]. static const size_t kMaxThreadLocalBracketSize = 128; - // The bracket size increment for the brackets of size <= 512 bytes. + // We use regular (8 or 16-bytes increment) runs for the size brackets whose indexes are less than + // this index. + static const size_t kNumRegularSizeBrackets = 40; + + // The size of the largest regular (8 or 16-byte increment) bracket. Non-regular brackets are the + // 1 KB and the 2 KB brackets. This should be equal to bracketSizes[kNumRegularSizeBrackets - 1]. + static const size_t kMaxRegularBracketSize = 512; + + // The bracket size increment for the thread-local brackets (<= kMaxThreadLocalBracketSize bytes). + static constexpr size_t kThreadLocalBracketQuantumSize = 8; + + // Equal to Log2(kThreadLocalBracketQuantumSize). + static constexpr size_t kThreadLocalBracketQuantumSizeShift = 3; + + // The bracket size increment for the non-thread-local, regular brackets (of size <= + // kMaxRegularBracketSize bytes and > kMaxThreadLocalBracketSize bytes). static constexpr size_t kBracketQuantumSize = 16; - // Equal to Log2(kQuantumBracketSizeIncrement). + // Equal to Log2(kBracketQuantumSize). static constexpr size_t kBracketQuantumSizeShift = 4; private: diff --git a/runtime/thread.cc b/runtime/thread.cc index 21241d240b..e47fdbcfdb 100644 --- a/runtime/thread.cc +++ b/runtime/thread.cc @@ -1599,7 +1599,7 @@ Thread::Thread(bool daemon) : tls32_(daemon), wait_monitor_(nullptr), interrupte tls32_.state_and_flags.as_struct.state = kNative; memset(&tlsPtr_.held_mutexes[0], 0, sizeof(tlsPtr_.held_mutexes)); std::fill(tlsPtr_.rosalloc_runs, - tlsPtr_.rosalloc_runs + kNumRosAllocThreadLocalSizeBrackets, + tlsPtr_.rosalloc_runs + kNumRosAllocThreadLocalSizeBracketsInThread, gc::allocator::RosAlloc::GetDedicatedFullRun()); for (uint32_t i = 0; i < kMaxCheckpoints; ++i) { tlsPtr_.checkpoint_functions[i] = nullptr; diff --git a/runtime/thread.h b/runtime/thread.h index b25bcb29bf..96919a436c 100644 --- a/runtime/thread.h +++ b/runtime/thread.h @@ -113,7 +113,8 @@ enum class StackedShadowFrameType { kSingleFrameDeoptimizationShadowFrame }; -static constexpr size_t kNumRosAllocThreadLocalSizeBrackets = 34; +// This should match RosAlloc::kNumThreadLocalSizeBrackets. +static constexpr size_t kNumRosAllocThreadLocalSizeBracketsInThread = 16; // Thread's stack layout for implicit stack overflow checks: // @@ -1413,7 +1414,7 @@ class Thread { void* mterp_alt_ibase; // There are RosAlloc::kNumThreadLocalSizeBrackets thread-local size brackets per thread. - void* rosalloc_runs[kNumRosAllocThreadLocalSizeBrackets]; + void* rosalloc_runs[kNumRosAllocThreadLocalSizeBracketsInThread]; // Thread-local allocation stack data/routines. StackReference<mirror::Object>* thread_local_alloc_stack_top; |