< prev index next >

src/share/vm/gc/shared/threadLocalAllocBuffer.inline.hpp

Print this page
rev 12310 : [mq]: gcinterface.patch


  42     // any concurrent GC thread.
  43     size_t hdr_size = oopDesc::header_size();
  44     Copy::fill_to_words(obj + hdr_size, size - hdr_size, badHeapWordVal);
  45 #endif // ASSERT
  46     // This addition is safe because we know that top is
  47     // at least size below end, so the add can't wrap.
  48     set_top(obj + size);
  49 
  50     invariants();
  51     return obj;
  52   }
  53   return NULL;
  54 }
  55 
  56 inline size_t ThreadLocalAllocBuffer::compute_size(size_t obj_size) {
  57   const size_t aligned_obj_size = align_object_size(obj_size);
  58 
  59   // Compute the size for the new TLAB.
  60   // The "last" tlab may be smaller to reduce fragmentation.
  61   // unsafe_max_tlab_alloc is just a hint.
  62   const size_t available_size = Universe::heap()->unsafe_max_tlab_alloc(myThread()) /
  63                                                   HeapWordSize;
  64   size_t new_tlab_size = MIN3(available_size, desired_size() + aligned_obj_size, max_size());
  65 
  66   // Make sure there's enough room for object and filler int[].
  67   const size_t obj_plus_filler_size = aligned_obj_size + alignment_reserve();
  68   if (new_tlab_size < obj_plus_filler_size) {
  69     // If there isn't enough room for the allocation, return failure.
  70     log_trace(gc, tlab)("ThreadLocalAllocBuffer::compute_size(" SIZE_FORMAT ") returns failure",
  71                         obj_size);
  72     return 0;
  73   }
  74   log_trace(gc, tlab)("ThreadLocalAllocBuffer::compute_size(" SIZE_FORMAT ") returns " SIZE_FORMAT,
  75                       obj_size, new_tlab_size);
  76   return new_tlab_size;
  77 }
  78 
  79 
  80 void ThreadLocalAllocBuffer::record_slow_allocation(size_t obj_size) {
  81   // Raise size required to bypass TLAB next time. Why? Else there's
  82   // a risk that a thread that repeatedly allocates objects of one


  42     // any concurrent GC thread.
  43     size_t hdr_size = oopDesc::header_size();
  44     Copy::fill_to_words(obj + hdr_size, size - hdr_size, badHeapWordVal);
  45 #endif // ASSERT
  46     // This addition is safe because we know that top is
  47     // at least size below end, so the add can't wrap.
  48     set_top(obj + size);
  49 
  50     invariants();
  51     return obj;
  52   }
  53   return NULL;
  54 }
  55 
  56 inline size_t ThreadLocalAllocBuffer::compute_size(size_t obj_size) {
  57   const size_t aligned_obj_size = align_object_size(obj_size);
  58 
  59   // Compute the size for the new TLAB.
  60   // The "last" tlab may be smaller to reduce fragmentation.
  61   // unsafe_max_tlab_alloc is just a hint.
  62   const size_t available_size = GC::gc()->heap()->unsafe_max_tlab_alloc(myThread()) /
  63                                                   HeapWordSize;
  64   size_t new_tlab_size = MIN3(available_size, desired_size() + aligned_obj_size, max_size());
  65 
  66   // Make sure there's enough room for object and filler int[].
  67   const size_t obj_plus_filler_size = aligned_obj_size + alignment_reserve();
  68   if (new_tlab_size < obj_plus_filler_size) {
  69     // If there isn't enough room for the allocation, return failure.
  70     log_trace(gc, tlab)("ThreadLocalAllocBuffer::compute_size(" SIZE_FORMAT ") returns failure",
  71                         obj_size);
  72     return 0;
  73   }
  74   log_trace(gc, tlab)("ThreadLocalAllocBuffer::compute_size(" SIZE_FORMAT ") returns " SIZE_FORMAT,
  75                       obj_size, new_tlab_size);
  76   return new_tlab_size;
  77 }
  78 
  79 
  80 void ThreadLocalAllocBuffer::record_slow_allocation(size_t obj_size) {
  81   // Raise size required to bypass TLAB next time. Why? Else there's
  82   // a risk that a thread that repeatedly allocates objects of one
< prev index next >