< prev index next >

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

Print this page

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