363 }
364
365 void MemAllocator::mem_clear(HeapWord* mem) const {
366 assert(mem != nullptr, "cannot initialize null object");
367 const size_t hs = oopDesc::header_size();
368 assert(_word_size >= hs, "unexpected object size");
369 if (oopDesc::has_klass_gap()) {
370 oopDesc::set_klass_gap(mem, 0);
371 }
372 Copy::fill_to_aligned_words(mem + hs, _word_size - hs);
373 }
374
375 oop MemAllocator::finish(HeapWord* mem) const {
376 assert(mem != nullptr, "null object pointer");
377 // Need a release store to ensure array/class length, mark word, and
378 // object zeroing are visible before setting the klass non-null, for
379 // concurrent collectors.
380 if (UseCompactObjectHeaders) {
381 oopDesc::release_set_mark(mem, _klass->prototype_header());
382 } else {
383 oopDesc::set_mark(mem, markWord::prototype());
384 oopDesc::release_set_klass(mem, _klass);
385 }
386 return cast_to_oop(mem);
387 }
388
389 oop ObjAllocator::initialize(HeapWord* mem) const {
390 mem_clear(mem);
391 return finish(mem);
392 }
393
394 oop ObjArrayAllocator::initialize(HeapWord* mem) const {
395 // Set array length before setting the _klass field because a
396 // non-null klass field indicates that the object is parsable by
397 // concurrent GC.
398 assert(_length >= 0, "length should be non-negative");
399 if (_do_zero) {
400 mem_clear(mem);
401 mem_zap_start_padding(mem);
402 mem_zap_end_padding(mem);
403 }
404 arrayOopDesc::set_length(mem, _length);
405 return finish(mem);
406 }
407
408 #ifndef PRODUCT
409 void ObjArrayAllocator::mem_zap_start_padding(HeapWord* mem) const {
410 const BasicType element_type = ArrayKlass::cast(_klass)->element_type();
411 const size_t base_offset_in_bytes = arrayOopDesc::base_offset_in_bytes(element_type);
412 const size_t header_size_in_bytes = arrayOopDesc::header_size_in_bytes();
413
|
363 }
364
365 void MemAllocator::mem_clear(HeapWord* mem) const {
366 assert(mem != nullptr, "cannot initialize null object");
367 const size_t hs = oopDesc::header_size();
368 assert(_word_size >= hs, "unexpected object size");
369 if (oopDesc::has_klass_gap()) {
370 oopDesc::set_klass_gap(mem, 0);
371 }
372 Copy::fill_to_aligned_words(mem + hs, _word_size - hs);
373 }
374
375 oop MemAllocator::finish(HeapWord* mem) const {
376 assert(mem != nullptr, "null object pointer");
377 // Need a release store to ensure array/class length, mark word, and
378 // object zeroing are visible before setting the klass non-null, for
379 // concurrent collectors.
380 if (UseCompactObjectHeaders) {
381 oopDesc::release_set_mark(mem, _klass->prototype_header());
382 } else {
383 if (EnableValhalla) {
384 oopDesc::set_mark(mem, _klass->prototype_header());
385 } else {
386 oopDesc::set_mark(mem, markWord::prototype());
387 }
388 oopDesc::release_set_klass(mem, _klass);
389 }
390 return cast_to_oop(mem);
391 }
392
393 oop ObjAllocator::initialize(HeapWord* mem) const {
394 mem_clear(mem);
395 return finish(mem);
396 }
397
398 oop ObjBufferAllocator::initialize(HeapWord* mem) const {
399 mem_clear(mem);
400 return finish(mem);
401 }
402
403
404 oop ObjArrayAllocator::initialize(HeapWord* mem) const {
405 // Set array length before setting the _klass field because a
406 // non-null klass field indicates that the object is parsable by
407 // concurrent GC.
408 assert(_length >= 0, "length should be non-negative");
409 if (_do_zero) {
410 mem_clear(mem);
411 mem_zap_start_padding(mem);
412 mem_zap_end_padding(mem);
413 }
414 arrayOopDesc::set_length(mem, _length);
415 return finish(mem);
416 }
417
418 #ifndef PRODUCT
419 void ObjArrayAllocator::mem_zap_start_padding(HeapWord* mem) const {
420 const BasicType element_type = ArrayKlass::cast(_klass)->element_type();
421 const size_t base_offset_in_bytes = arrayOopDesc::base_offset_in_bytes(element_type);
422 const size_t header_size_in_bytes = arrayOopDesc::header_size_in_bytes();
423
|