Mercurial > hg > truffle
diff src/share/vm/c1/c1_Runtime1.cpp @ 3714:b648304ba4ff
Change Graal monitor enter and exit from BasicObjectLock to BasicLock
author | Christian Wimmer <christian.wimmer@oracle.com> |
---|---|
date | Tue, 13 Dec 2011 21:17:46 -0800 |
parents | bc95d122df79 |
children | 82f88223fcff |
line wrap: on
line diff
--- a/src/share/vm/c1/c1_Runtime1.cpp Tue Dec 13 21:16:50 2011 -0800 +++ b/src/share/vm/c1/c1_Runtime1.cpp Tue Dec 13 21:17:46 2011 -0800 @@ -658,6 +658,68 @@ JRT_END +JRT_ENTRY_NO_ASYNC(void, Runtime1::graal_monitorenter(JavaThread* thread, oopDesc* obj, BasicLock* lock)) + NOT_PRODUCT(_monitorenter_slowcase_cnt++;) +#ifdef ASSERT + if (TraceGraal >= 3) { + tty->print_cr("entered locking slow case with obj=" INTPTR_FORMAT " and lock= " INTPTR_FORMAT, obj, lock); + } + if (PrintBiasedLockingStatistics) { + Atomic::inc(BiasedLocking::slow_path_entry_count_addr()); + } +#endif + Handle h_obj(thread, obj); + assert(h_obj()->is_oop(), "must be NULL or an object"); + if (UseBiasedLocking) { + // Retry fast entry if bias is revoked to avoid unnecessary inflation + ObjectSynchronizer::fast_enter(h_obj, lock, true, CHECK); + } else { + if (UseFastLocking) { + // When using fast locking, the compiled code has already tried the fast case + ObjectSynchronizer::slow_enter(h_obj, lock, THREAD); + } else { + ObjectSynchronizer::fast_enter(h_obj, lock, false, THREAD); + } + } +#ifdef ASSERT + if (TraceGraal >= 3) { + tty->print_cr("exiting locking"); + lock->lock()->print_on(tty); + tty->print_cr(""); + tty->print_cr("done"); + } +#endif +JRT_END + + +JRT_LEAF(void, Runtime1::graal_monitorexit(JavaThread* thread, oopDesc* obj, BasicLock* lock)) + NOT_PRODUCT(_monitorexit_slowcase_cnt++;) + assert(thread == JavaThread::current(), "threads must correspond"); + assert(thread->last_Java_sp(), "last_Java_sp must be set"); + // monitorexit is non-blocking (leaf routine) => no exceptions can be thrown + EXCEPTION_MARK; + +#ifdef DEBUG + if (!obj->is_oop()) { + ResetNoHandleMark rhm; + nmethod* method = thread->last_frame().cb()->as_nmethod_or_null(); + if (method != NULL) { + tty->print_cr("ERROR in monitorexit in method %s wrong obj " INTPTR_FORMAT, method->name(), obj); + } + thread->print_stack_on(tty); + assert(false, "invalid lock object pointer dected"); + } +#endif + + if (UseFastLocking) { + // When using fast locking, the compiled code has already tried the fast case + ObjectSynchronizer::slow_exit(obj, lock, THREAD); + } else { + ObjectSynchronizer::fast_exit(obj, lock, THREAD); + } +JRT_END + + JRT_ENTRY_NO_ASYNC(void, Runtime1::monitorenter(JavaThread* thread, oopDesc* obj, BasicObjectLock* lock)) NOT_PRODUCT(_monitorenter_slowcase_cnt++;) #ifdef ASSERT