359 {
360 Allocation allocation(*this, &obj);
361 HeapWord* mem = mem_allocate(allocation);
362 if (mem != NULL) {
363 obj = initialize(mem);
364 }
365 }
366 return obj;
367 }
368
369 void MemAllocator::mem_clear(HeapWord* mem) const {
370 assert(mem != NULL, "cannot initialize NULL object");
371 const size_t hs = oopDesc::header_size();
372 assert(_word_size >= hs, "unexpected object size");
373 oopDesc::set_klass_gap(mem, 0);
374 Copy::fill_to_aligned_words(mem + hs, _word_size - hs);
375 }
376
377 oop MemAllocator::finish(HeapWord* mem) const {
378 assert(mem != NULL, "NULL object pointer");
379 if (UseBiasedLocking) {
380 oopDesc::set_mark_raw(mem, _klass->prototype_header());
381 } else {
382 // May be bootstrapping
383 oopDesc::set_mark_raw(mem, markOopDesc::prototype());
384 }
385 // Need a release store to ensure array/class length, mark word, and
386 // object zeroing are visible before setting the klass non-NULL, for
387 // concurrent collectors.
388 oopDesc::release_set_klass(mem, _klass);
389 return oop(mem);
390 }
391
392 oop ObjAllocator::initialize(HeapWord* mem) const {
393 mem_clear(mem);
394 return finish(mem);
395 }
396
397 MemRegion ObjArrayAllocator::obj_memory_range(oop obj) const {
398 if (_do_zero) {
399 return MemAllocator::obj_memory_range(obj);
400 }
401 ArrayKlass* array_klass = ArrayKlass::cast(_klass);
402 const size_t hs = arrayOopDesc::header_size(array_klass->element_type());
403 return MemRegion(((HeapWord*)obj) + hs, _word_size - hs);
404 }
|
359 {
360 Allocation allocation(*this, &obj);
361 HeapWord* mem = mem_allocate(allocation);
362 if (mem != NULL) {
363 obj = initialize(mem);
364 }
365 }
366 return obj;
367 }
368
369 void MemAllocator::mem_clear(HeapWord* mem) const {
370 assert(mem != NULL, "cannot initialize NULL object");
371 const size_t hs = oopDesc::header_size();
372 assert(_word_size >= hs, "unexpected object size");
373 oopDesc::set_klass_gap(mem, 0);
374 Copy::fill_to_aligned_words(mem + hs, _word_size - hs);
375 }
376
377 oop MemAllocator::finish(HeapWord* mem) const {
378 assert(mem != NULL, "NULL object pointer");
379 oopDesc::set_mark_raw(mem, Klass::default_prototype_header(_klass));
380 // Need a release store to ensure array/class length, mark word, and
381 // object zeroing are visible before setting the klass non-NULL, for
382 // concurrent collectors.
383 oopDesc::release_set_klass(mem, _klass);
384 return oop(mem);
385 }
386
387 oop ObjAllocator::initialize(HeapWord* mem) const {
388 mem_clear(mem);
389 return finish(mem);
390 }
391
392 MemRegion ObjArrayAllocator::obj_memory_range(oop obj) const {
393 if (_do_zero) {
394 return MemAllocator::obj_memory_range(obj);
395 }
396 ArrayKlass* array_klass = ArrayKlass::cast(_klass);
397 const size_t hs = arrayOopDesc::header_size(array_klass->element_type());
398 return MemRegion(((HeapWord*)obj) + hs, _word_size - hs);
399 }
|