227 assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed"); 228 assert(size >= 0, "int won't convert to size_t"); 229 HeapWord* obj = common_mem_allocate_noinit(klass, size, CHECK_NULL); 230 ((oop)obj)->set_klass_gap(0); 231 post_allocation_setup_array(klass, obj, length); 232 #ifndef PRODUCT 233 const size_t hs = oopDesc::header_size()+1; 234 Universe::heap()->check_for_non_bad_heap_word_value(obj+hs, size-hs); 235 #endif 236 return (oop)obj; 237 } 238 239 inline HeapWord* CollectedHeap::align_allocation_or_fail(HeapWord* addr, 240 HeapWord* end, 241 unsigned short alignment_in_bytes) { 242 if (alignment_in_bytes <= ObjectAlignmentInBytes) { 243 return addr; 244 } 245 246 assert(is_ptr_aligned(addr, HeapWordSize), 247 err_msg("Address " PTR_FORMAT " is not properly aligned.", p2i(addr))); 248 assert(is_size_aligned(alignment_in_bytes, HeapWordSize), 249 err_msg("Alignment size %u is incorrect.", alignment_in_bytes)); 250 251 HeapWord* new_addr = (HeapWord*) align_pointer_up(addr, alignment_in_bytes); 252 size_t padding = pointer_delta(new_addr, addr); 253 254 if (padding == 0) { 255 return addr; 256 } 257 258 if (padding < CollectedHeap::min_fill_size()) { 259 padding += alignment_in_bytes / HeapWordSize; 260 assert(padding >= CollectedHeap::min_fill_size(), 261 err_msg("alignment_in_bytes %u is expect to be larger " 262 "than the minimum object size", alignment_in_bytes)); 263 new_addr = addr + padding; 264 } 265 266 assert(new_addr > addr, err_msg("Unexpected arithmetic overflow " 267 PTR_FORMAT " not greater than " PTR_FORMAT, p2i(new_addr), p2i(addr))); 268 if(new_addr < end) { 269 CollectedHeap::fill_with_object(addr, padding); 270 return new_addr; 271 } else { 272 return NULL; 273 } 274 } 275 276 #ifndef PRODUCT 277 278 inline bool 279 CollectedHeap::promotion_should_fail(volatile size_t* count) { 280 // Access to count is not atomic; the value does not have to be exact. 281 if (PromotionFailureALot) { 282 const size_t gc_num = total_collections(); 283 const size_t elapsed_gcs = gc_num - _promotion_failure_alot_gc_number; 284 if (elapsed_gcs >= PromotionFailureALotInterval) { 285 // Test for unsigned arithmetic wrap-around. 286 if (++*count >= PromotionFailureALotCount) { 287 *count = 0; | 227 assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed"); 228 assert(size >= 0, "int won't convert to size_t"); 229 HeapWord* obj = common_mem_allocate_noinit(klass, size, CHECK_NULL); 230 ((oop)obj)->set_klass_gap(0); 231 post_allocation_setup_array(klass, obj, length); 232 #ifndef PRODUCT 233 const size_t hs = oopDesc::header_size()+1; 234 Universe::heap()->check_for_non_bad_heap_word_value(obj+hs, size-hs); 235 #endif 236 return (oop)obj; 237 } 238 239 inline HeapWord* CollectedHeap::align_allocation_or_fail(HeapWord* addr, 240 HeapWord* end, 241 unsigned short alignment_in_bytes) { 242 if (alignment_in_bytes <= ObjectAlignmentInBytes) { 243 return addr; 244 } 245 246 assert(is_ptr_aligned(addr, HeapWordSize), 247 "Address " PTR_FORMAT " is not properly aligned.", p2i(addr)); 248 assert(is_size_aligned(alignment_in_bytes, HeapWordSize), 249 "Alignment size %u is incorrect.", alignment_in_bytes); 250 251 HeapWord* new_addr = (HeapWord*) align_pointer_up(addr, alignment_in_bytes); 252 size_t padding = pointer_delta(new_addr, addr); 253 254 if (padding == 0) { 255 return addr; 256 } 257 258 if (padding < CollectedHeap::min_fill_size()) { 259 padding += alignment_in_bytes / HeapWordSize; 260 assert(padding >= CollectedHeap::min_fill_size(), 261 "alignment_in_bytes %u is expect to be larger " 262 "than the minimum object size", alignment_in_bytes); 263 new_addr = addr + padding; 264 } 265 266 assert(new_addr > addr, "Unexpected arithmetic overflow " 267 PTR_FORMAT " not greater than " PTR_FORMAT, p2i(new_addr), p2i(addr)); 268 if(new_addr < end) { 269 CollectedHeap::fill_with_object(addr, padding); 270 return new_addr; 271 } else { 272 return NULL; 273 } 274 } 275 276 #ifndef PRODUCT 277 278 inline bool 279 CollectedHeap::promotion_should_fail(volatile size_t* count) { 280 // Access to count is not atomic; the value does not have to be exact. 281 if (PromotionFailureALot) { 282 const size_t gc_num = total_collections(); 283 const size_t elapsed_gcs = gc_num - _promotion_failure_alot_gc_number; 284 if (elapsed_gcs >= PromotionFailureALotInterval) { 285 // Test for unsigned arithmetic wrap-around. 286 if (++*count >= PromotionFailureALotCount) { 287 *count = 0; |