384 assert(mem != NULL, "NULL object pointer"); 385 oopDesc::set_mark_raw(mem, Klass::default_prototype_header(_klass)); 386 // Need a release store to ensure array/class length, mark word, and 387 // object zeroing are visible before setting the klass non-NULL, for 388 // concurrent collectors. 389 oopDesc::release_set_klass(mem, _klass); 390 return oop(mem); 391 } 392 393 oop MemAllocator::finish_with_properties(HeapWord* mem, ArrayStorageProperties storage_props) const { 394 finish(mem); 395 oopDesc::release_set_metadata(mem, storage_props, _klass); 396 return oop(mem); 397 } 398 399 oop ObjAllocator::initialize(HeapWord* mem) const { 400 mem_clear(mem); 401 return finish(mem); 402 } 403 404 MemRegion ObjArrayAllocator::obj_memory_range(oop obj) const { 405 if (_do_zero) { 406 return MemAllocator::obj_memory_range(obj); 407 } 408 ArrayKlass* array_klass = ArrayKlass::cast(_klass); 409 const size_t hs = arrayOopDesc::header_size(array_klass->element_type()); 410 return MemRegion(((HeapWord*)obj) + hs, _word_size - hs); 411 } 412 413 oop ObjArrayAllocator::initialize(HeapWord* mem) const { 414 // Set array length before setting the _klass field because a 415 // non-NULL klass field indicates that the object is parsable by 416 // concurrent GC. 417 assert(_length >= 0, "length should be non-negative"); 418 if (_do_zero) { 419 mem_clear(mem); 420 } 421 arrayOopDesc::set_length(mem, _length); 422 assert(ArrayKlass::cast(_klass)->storage_properties().is_empty() || 423 ArrayKlass::cast(_klass)->dimension() == 1, "Multidim should have no storage props"); | 384 assert(mem != NULL, "NULL object pointer"); 385 oopDesc::set_mark_raw(mem, Klass::default_prototype_header(_klass)); 386 // Need a release store to ensure array/class length, mark word, and 387 // object zeroing are visible before setting the klass non-NULL, for 388 // concurrent collectors. 389 oopDesc::release_set_klass(mem, _klass); 390 return oop(mem); 391 } 392 393 oop MemAllocator::finish_with_properties(HeapWord* mem, ArrayStorageProperties storage_props) const { 394 finish(mem); 395 oopDesc::release_set_metadata(mem, storage_props, _klass); 396 return oop(mem); 397 } 398 399 oop ObjAllocator::initialize(HeapWord* mem) const { 400 mem_clear(mem); 401 return finish(mem); 402 } 403 404 oop ObjBufferAllocator::initialize(HeapWord* mem) const { 405 oopDesc::set_klass_gap(mem, 0); 406 return finish(mem); 407 } 408 409 410 MemRegion ObjArrayAllocator::obj_memory_range(oop obj) const { 411 if (_do_zero) { 412 return MemAllocator::obj_memory_range(obj); 413 } 414 ArrayKlass* array_klass = ArrayKlass::cast(_klass); 415 const size_t hs = arrayOopDesc::header_size(array_klass->element_type()); 416 return MemRegion(((HeapWord*)obj) + hs, _word_size - hs); 417 } 418 419 oop ObjArrayAllocator::initialize(HeapWord* mem) const { 420 // Set array length before setting the _klass field because a 421 // non-NULL klass field indicates that the object is parsable by 422 // concurrent GC. 423 assert(_length >= 0, "length should be non-negative"); 424 if (_do_zero) { 425 mem_clear(mem); 426 } 427 arrayOopDesc::set_length(mem, _length); 428 assert(ArrayKlass::cast(_klass)->storage_properties().is_empty() || 429 ArrayKlass::cast(_klass)->dimension() == 1, "Multidim should have no storage props"); |