mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-18 10:04:42 +02:00
8267579: Thread::cooked_allocated_bytes() hits assert(left >= right) failed: avoid underflow
Reviewed-by: dcubed, stefank, kbarrett
This commit is contained in:
parent
51f3427e9b
commit
c4207355d3
3 changed files with 21 additions and 1 deletions
|
@ -31,6 +31,7 @@
|
|||
#include "memory/resourceArea.hpp"
|
||||
#include "memory/universe.hpp"
|
||||
#include "oops/oop.inline.hpp"
|
||||
#include "runtime/atomic.hpp"
|
||||
#include "runtime/perfData.hpp"
|
||||
#include "runtime/thread.inline.hpp"
|
||||
#include "runtime/threadSMR.hpp"
|
||||
|
@ -473,3 +474,11 @@ size_t ThreadLocalAllocBuffer::end_reserve() {
|
|||
size_t reserve_size = Universe::heap()->tlab_alloc_reserve();
|
||||
return MAX2(reserve_size, (size_t)_reserve_for_allocation_prefetch);
|
||||
}
|
||||
|
||||
const HeapWord* ThreadLocalAllocBuffer::start_relaxed() const {
|
||||
return Atomic::load(&_start);
|
||||
}
|
||||
|
||||
const HeapWord* ThreadLocalAllocBuffer::top_relaxed() const {
|
||||
return Atomic::load(&_top);
|
||||
}
|
||||
|
|
|
@ -129,6 +129,10 @@ public:
|
|||
size_t refill_waste_limit() const { return _refill_waste_limit; }
|
||||
size_t bytes_since_last_sample_point() const { return _bytes_since_last_sample_point; }
|
||||
|
||||
// For external inspection.
|
||||
const HeapWord* start_relaxed() const;
|
||||
const HeapWord* top_relaxed() const;
|
||||
|
||||
// Allocate size HeapWords. The memory is NOT initialized to zero.
|
||||
inline HeapWord* allocate(size_t size);
|
||||
|
||||
|
|
|
@ -41,7 +41,14 @@
|
|||
inline jlong Thread::cooked_allocated_bytes() {
|
||||
jlong allocated_bytes = Atomic::load_acquire(&_allocated_bytes);
|
||||
if (UseTLAB) {
|
||||
size_t used_bytes = tlab().used_bytes();
|
||||
// These reads are unsynchronized and unordered with the thread updating its tlab pointers.
|
||||
// Use only if top > start && used_bytes <= max_tlab_size_bytes.
|
||||
const HeapWord* const top = tlab().top_relaxed();
|
||||
const HeapWord* const start = tlab().start_relaxed();
|
||||
if (top <= start) {
|
||||
return allocated_bytes;
|
||||
}
|
||||
const size_t used_bytes = pointer_delta(top, start, 1);
|
||||
if (used_bytes <= ThreadLocalAllocBuffer::max_size_in_bytes()) {
|
||||
// Comparing used_bytes with the maximum allowed size will ensure
|
||||
// that we don't add the used bytes from a semi-initialized TLAB
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue