< prev index next >

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

Print this page

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