inline mirror::Object* BumpPointerSpace::AllocThreadUnsafe(Thread* self, size_t num_bytes,
size_t* bytes_allocated,
size_t* usable_size,
size_t* bytes_tl_bulk_allocated) {
Locks::mutator_lock_->AssertExclusiveHeld(self);
num_bytes = RoundUp(num_bytes, kAlignment);
uint8_t* end = end_.load(std::memory_order_relaxed); if (end + num_bytes > growth_end_) { return nullptr;
}
mirror::Object* obj = reinterpret_cast<mirror::Object*>(end);
end_.store(end + num_bytes, std::memory_order_relaxed);
*bytes_allocated = num_bytes; // Use the CAS free versions as an optimization.
objects_allocated_.store(objects_allocated_.load(std::memory_order_relaxed) + 1,
std::memory_order_relaxed);
bytes_allocated_.store(bytes_allocated_.load(std::memory_order_relaxed) + num_bytes,
std::memory_order_relaxed); if (UNLIKELY(usable_size != nullptr)) {
*usable_size = num_bytes;
}
*bytes_tl_bulk_allocated = num_bytes; return obj;
}
inline mirror::Object* BumpPointerSpace::AllocNonvirtualWithoutAccounting(size_t num_bytes) {
DCHECK_ALIGNED(num_bytes, kAlignment);
uint8_t* old_end;
uint8_t* new_end; do {
old_end = end_.load(std::memory_order_relaxed);
new_end = old_end + num_bytes; // If there is no more room in the region, we are out of memory. if (UNLIKELY(new_end > growth_end_)) { return nullptr;
}
} while (!end_.CompareAndSetWeakSequentiallyConsistent(old_end, new_end)); returnreinterpret_cast<mirror::Object*>(old_end);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.