# HG changeset patch # User sjohanss # Date 1465396152 -7200 # Node ID f08faf52511358f732feae4ca48c13cfae312d49 # Parent 1b33aa56ed18625aefdae05e004f5fbb1adeedcd 8149085: IntegrationTest1.java fails intermittently due to use of semi-initialized TLAB Reviewed-by: ehelin, mgerdin diff -r 1b33aa56ed18 -r f08faf525113 hotspot/src/share/vm/gc/shared/threadLocalAllocBuffer.hpp --- a/hotspot/src/share/vm/gc/shared/threadLocalAllocBuffer.hpp Wed Jun 08 11:15:49 2016 +0200 +++ b/hotspot/src/share/vm/gc/shared/threadLocalAllocBuffer.hpp Wed Jun 08 16:29:12 2016 +0200 @@ -110,6 +110,7 @@ static const size_t min_size() { return align_object_size(MinTLABSize / HeapWordSize) + alignment_reserve(); } static const size_t max_size() { assert(_max_size != 0, "max_size not set up"); return _max_size; } + static const size_t max_size_in_bytes() { return max_size() * BytesPerWord; } static void set_max_size(size_t max_size) { _max_size = max_size; } HeapWord* start() const { return _start; } diff -r 1b33aa56ed18 -r f08faf525113 hotspot/src/share/vm/runtime/thread.inline.hpp --- a/hotspot/src/share/vm/runtime/thread.inline.hpp Wed Jun 08 11:15:49 2016 +0200 +++ b/hotspot/src/share/vm/runtime/thread.inline.hpp Wed Jun 08 16:29:12 2016 +0200 @@ -71,9 +71,12 @@ jlong allocated_bytes = OrderAccess::load_acquire(&_allocated_bytes); if (UseTLAB) { size_t used_bytes = tlab().used_bytes(); - if ((ssize_t)used_bytes > 0) { - // More-or-less valid tlab. The load_acquire above should ensure - // that the result of the add is <= the instantaneous value. + 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 + // ending up with incorrect values. There is still a race between + // incrementing _allocated_bytes and clearing the TLAB, that might + // cause double counting in rare cases. return allocated_bytes + used_bytes; } }