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