hotspot/src/share/vm/opto/runtime.cpp
changeset 4637 af4d405aacc1
parent 4571 80b553bddc26
child 4754 8aef16f24e16
child 4761 bdb7375a1fee
equal deleted inserted replaced
4636:90e004691873 4637:af4d405aacc1
   141 
   141 
   142 //=============================allocation======================================
   142 //=============================allocation======================================
   143 // We failed the fast-path allocation.  Now we need to do a scavenge or GC
   143 // We failed the fast-path allocation.  Now we need to do a scavenge or GC
   144 // and try allocation again.
   144 // and try allocation again.
   145 
   145 
   146 void OptoRuntime::maybe_defer_card_mark(JavaThread* thread) {
   146 void OptoRuntime::new_store_pre_barrier(JavaThread* thread) {
   147   // After any safepoint, just before going back to compiled code,
   147   // After any safepoint, just before going back to compiled code,
   148   // we inform the GC that we will be doing initializing writes to
   148   // we inform the GC that we will be doing initializing writes to
   149   // this object in the future without emitting card-marks, so
   149   // this object in the future without emitting card-marks, so
   150   // GC may take any compensating steps.
   150   // GC may take any compensating steps.
   151   // NOTE: Keep this code consistent with GraphKit::store_barrier.
   151   // NOTE: Keep this code consistent with GraphKit::store_barrier.
   154   if (new_obj == NULL)  return;
   154   if (new_obj == NULL)  return;
   155 
   155 
   156   assert(Universe::heap()->can_elide_tlab_store_barriers(),
   156   assert(Universe::heap()->can_elide_tlab_store_barriers(),
   157          "compiler must check this first");
   157          "compiler must check this first");
   158   // GC may decide to give back a safer copy of new_obj.
   158   // GC may decide to give back a safer copy of new_obj.
   159   new_obj = Universe::heap()->defer_store_barrier(thread, new_obj);
   159   new_obj = Universe::heap()->new_store_pre_barrier(thread, new_obj);
   160   thread->set_vm_result(new_obj);
   160   thread->set_vm_result(new_obj);
   161 }
   161 }
   162 
   162 
   163 // object allocation
   163 // object allocation
   164 JRT_BLOCK_ENTRY(void, OptoRuntime::new_instance_C(klassOopDesc* klass, JavaThread* thread))
   164 JRT_BLOCK_ENTRY(void, OptoRuntime::new_instance_C(klassOopDesc* klass, JavaThread* thread))
   198   deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
   198   deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION);
   199   JRT_BLOCK_END;
   199   JRT_BLOCK_END;
   200 
   200 
   201   if (GraphKit::use_ReduceInitialCardMarks()) {
   201   if (GraphKit::use_ReduceInitialCardMarks()) {
   202     // inform GC that we won't do card marks for initializing writes.
   202     // inform GC that we won't do card marks for initializing writes.
   203     maybe_defer_card_mark(thread);
   203     new_store_pre_barrier(thread);
   204   }
   204   }
   205 JRT_END
   205 JRT_END
   206 
   206 
   207 
   207 
   208 // array allocation
   208 // array allocation
   237   thread->set_vm_result(result);
   237   thread->set_vm_result(result);
   238   JRT_BLOCK_END;
   238   JRT_BLOCK_END;
   239 
   239 
   240   if (GraphKit::use_ReduceInitialCardMarks()) {
   240   if (GraphKit::use_ReduceInitialCardMarks()) {
   241     // inform GC that we won't do card marks for initializing writes.
   241     // inform GC that we won't do card marks for initializing writes.
   242     maybe_defer_card_mark(thread);
   242     new_store_pre_barrier(thread);
   243   }
   243   }
   244 JRT_END
   244 JRT_END
   245 
   245 
   246 // Note: multianewarray for one dimension is handled inline by GraphKit::new_array.
   246 // Note: multianewarray for one dimension is handled inline by GraphKit::new_array.
   247 
   247