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