< prev index next >

src/hotspot/share/gc/shared/memAllocator.cpp

Print this page

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 
< prev index next >