From b55758db9352ddfc90fb7951551fa18a1576a728 Mon Sep 17 00:00:00 2001 From: Salikh Zakirov Date: Thu, 30 Nov 2006 14:40:33 +0300 Subject: [PATCH] configure TM_LOCK_RESERVATION from -Dthread.lock_reservation --- vm/thread/src/hythr.def | 1 + vm/thread/src/hythr.exp | 1 + vm/thread/src/thread_init.c | 3 + vm/thread/src/thread_java_monitors.c | 3 + vm/thread/src/thread_native_thin_monitor.c | 75 +++++++++++++++++----------- vm/thread/src/thread_private.h | 2 + vm/vmcore/src/init/vm.cpp | 2 + vm/vmcore/src/thread/mon_enter_exit.cpp | 3 + 8 files changed, 61 insertions(+), 29 deletions(-) diff --git a/vm/thread/src/hythr.def b/vm/thread/src/hythr.def index 09eb9b9..8829955 100644 --- a/vm/thread/src/hythr.def +++ b/vm/thread/src/hythr.def @@ -148,3 +148,4 @@ array_delete array_get get_local_pool get_java_thread_group +TM_LOCK_RESERVATION diff --git a/vm/thread/src/hythr.exp b/vm/thread/src/hythr.exp index a9dc440..d225033 100644 --- a/vm/thread/src/hythr.exp +++ b/vm/thread/src/hythr.exp @@ -159,6 +159,7 @@ array_delete; array_get; get_local_pool; get_java_thread_group; +TM_LOCK_RESERVATION; local: *; diff --git a/vm/thread/src/thread_init.c b/vm/thread/src/thread_init.c index 3f2e119..40a4ec0 100644 --- a/vm/thread/src/thread_init.c +++ b/vm/thread/src/thread_init.c @@ -58,6 +58,9 @@ int table_size = 8024; IDATA groups_count; +/// global switch to disable lock reservation algorithm +unsigned TM_LOCK_RESERVATION = 1; + static IDATA init_group_list(); static IDATA destroy_group_list(); diff --git a/vm/thread/src/thread_java_monitors.c b/vm/thread/src/thread_java_monitors.c index 9d125d0..da7f32c 100644 --- a/vm/thread/src/thread_java_monitors.c +++ b/vm/thread/src/thread_java_monitors.c @@ -60,6 +60,7 @@ IDATA VMCALL jthread_monitor_init(jobject monitor) { } +extern unsigned TM_LOCK_RESERVATION; /** * Gains the ownership over monitor. @@ -88,6 +89,7 @@ IDATA VMCALL jthread_monitor_enter(jobject monitor) { ///////// #ifdef LOCK_RESERVATION + if (TM_LOCK_RESERVATION) { // busy unreserve lock before blocking and inflating while (TM_ERROR_NONE !=unreserve_lock(lockword)) { hythread_yield(); @@ -98,6 +100,7 @@ IDATA VMCALL jthread_monitor_enter(jobject monitor) { if (status != TM_ERROR_EBUSY) { goto entered; } + } #endif //LOCK_RESERVATION tm_native_thread = hythread_self(); tm_native_thread->state &= ~TM_THREAD_STATE_RUNNABLE; diff --git a/vm/thread/src/thread_native_thin_monitor.c b/vm/thread/src/thread_native_thin_monitor.c index 4753e57..bfafd38 100644 --- a/vm/thread/src/thread_native_thin_monitor.c +++ b/vm/thread/src/thread_native_thin_monitor.c @@ -66,17 +66,20 @@ IDATA owns_thin_lock(hythread_t thread, I_32 lockword) { IDATA this_id = thread->thread_id; assert(!IS_FAT_LOCK(lockword)); #ifdef LOCK_RESERVATION + if (TM_LOCK_RESERVATION) { return THREAD_ID(lockword) == this_id && (!IS_RESERVED(lockword) || RECURSION(lockword) !=0); -#else - return THREAD_ID(lockword) == this_id; + } #endif + return THREAD_ID(lockword) == this_id; } void set_fat_lock_id(hythread_thin_monitor_t *lockword_ptr, IDATA monitor_id) { I_32 lockword = *lockword_ptr; #ifdef LOCK_RESERVATION + if (TM_LOCK_RESERVATION) { assert(!IS_RESERVED(lockword)); + } #endif lockword&=0x7FF; lockword|=(monitor_id << 11) | 0x80000000; @@ -283,10 +286,12 @@ IDATA hythread_thin_monitor_try_enter(hythread_thin_monitor_t *lockword_ptr) { } #ifdef LOCK_RESERVATION - //lockword = *lockword_ptr; // this reloading of lockword may be odd, need to investigate; - if (IS_RESERVED(lockword)) { - TRACE(("initialy reserve lock %x count: %d ", *lockword_ptr, init_reserve_cout++)); - RECURSION_INC(lockword_ptr, *lockword_ptr); + if (TM_LOCK_RESERVATION) { + //lockword = *lockword_ptr; // this reloading of lockword may be odd, need to investigate; + if (IS_RESERVED(lockword)) { + TRACE(("initialy reserve lock %x count: %d ", *lockword_ptr, init_reserve_cout++)); + RECURSION_INC(lockword_ptr, *lockword_ptr); + } } #endif TRACE(("CAS lock %x count: %d ", *lockword_ptr, cas_cout++)); @@ -308,19 +313,21 @@ IDATA hythread_thin_monitor_try_enter(hythread_thin_monitor_t *lockword_ptr) { } #ifdef LOCK_RESERVATION - // unreserved busy lock - else if (IS_RESERVED(lockword)) { - status = unreserve_lock(lockword_ptr); - if (status != TM_ERROR_NONE) { + else if (TM_LOCK_RESERVATION) { + // unreserved busy lock + if (IS_RESERVED(lockword)) { + status = unreserve_lock(lockword_ptr); + if (status != TM_ERROR_NONE) { #ifdef SPIN_COUNT - if (status == TM_ERROR_EBUSY) { - continue; - } + if (status == TM_ERROR_EBUSY) { + continue; + } #endif //SPIN_COUNT - return status; + return status; + } + assert(!IS_RESERVED(*lockword_ptr)); + return hythread_thin_monitor_try_enter(lockword_ptr); } - assert(!IS_RESERVED(*lockword_ptr)); - return hythread_thin_monitor_try_enter(lockword_ptr); } #endif #ifdef SPIN_COUNT @@ -383,9 +390,11 @@ IDATA VMCALL hythread_thin_monitor_exit(hythread_thin_monitor_t *lockword_ptr) { if (THREAD_ID(lockword) == this_id) { if (RECURSION(lockword)==0) { #ifdef LOCK_RESERVATION - if (IS_RESERVED(lockword)) { - TRACE(("ILLEGAL_STATE %x\n", lockword)); - return TM_ERROR_ILLEGAL_STATE; + if (TM_LOCK_RESERVATION) { + if (IS_RESERVED(lockword)) { + TRACE(("ILLEGAL_STATE %x\n", lockword)); + return TM_ERROR_ILLEGAL_STATE; + } } #endif *lockword_ptr = lockword & 0xffff; @@ -561,12 +570,14 @@ hythread_monitor_t VMCALL inflate_lock(hythread_thin_monitor_t *lockword_ptr) { return locktable_get_fat_monitor(FAT_LOCK_ID(lockword)); } #ifdef LOCK_RESERVATION - // unreserve lock first - if (IS_RESERVED(lockword)) { - unreserve_self_lock(lockword_ptr); - lockword = *lockword_ptr; + if (TM_LOCK_RESERVATION) { + // unreserve lock first + if (IS_RESERVED(lockword)) { + unreserve_self_lock(lockword_ptr); + lockword = *lockword_ptr; + } + assert(!IS_RESERVED(lockword)); } - assert(!IS_RESERVED(lockword)); #endif assert(owns_thin_lock(tm_self_tls, lockword)); @@ -596,7 +607,9 @@ hythread_monitor_t VMCALL inflate_lock(hythread_thin_monitor_t *lockword_ptr) { status=hymutex_unlock(FAT_MONITOR_TABLE_LOCK); assert (status == TM_ERROR_NONE); #ifdef LOCK_RESERVATION - assert(!IS_RESERVED(*lockword_ptr)); + if (TM_LOCK_RESERVATION) { + assert(!IS_RESERVED(*lockword_ptr)); + } #endif return fat_monitor; } @@ -700,8 +713,10 @@ hythread_t VMCALL hythread_thin_monitor_get_owner(hythread_thin_monitor_t *lockw } #ifdef LOCK_RESERVATION - if (RECURSION(lockword)==0 && IS_RESERVED(lockword)) { - return NULL; + if (TM_LOCK_RESERVATION) { + if (RECURSION(lockword)==0 && IS_RESERVED(lockword)) { + return NULL; + } } #endif return hythread_get_thread(THREAD_ID(lockword)); @@ -726,8 +741,10 @@ IDATA VMCALL hythread_thin_monitor_get_recursion(hythread_thin_monitor_t *lockwo return 0; } #ifdef LOCK_RESERVATION - if (IS_RESERVED(lockword)) { - return RECURSION(lockword); + if (TM_LOCK_RESERVATION) { + if (IS_RESERVED(lockword)) { + return RECURSION(lockword); + } } #endif return RECURSION(lockword)+1; diff --git a/vm/thread/src/thread_private.h b/vm/thread/src/thread_private.h index f3b5354..78137ed 100644 --- a/vm/thread/src/thread_private.h +++ b/vm/thread/src/thread_private.h @@ -150,6 +150,8 @@ extern int16 tm_tls_capacity; */ extern int16 tm_tls_size; +/// global switch to enable lock reservation +extern unsigned TM_LOCK_RESERVATION; typedef struct HyThreadLibrary { IDATA a; diff --git a/vm/vmcore/src/init/vm.cpp b/vm/vmcore/src/init/vm.cpp index 3980826..3b9c10d 100644 --- a/vm/vmcore/src/init/vm.cpp +++ b/vm/vmcore/src/init/vm.cpp @@ -97,6 +97,8 @@ static struct VmStandardProperty { // Sorted only for convenience. {"gc.verbose", "Controls GC verbosity", true, FALSE}, + {"thread.lock_reservation", "Enables lock reservation", + true, TRUE}, {"vm.assert_dialog", "If false, prevent assertion failures from popping up a dialog box.", true, TRUE}, #ifdef PLATFORM_POSIX diff --git a/vm/vmcore/src/init/vm_main.cpp b/vm/vmcore/src/init/vm_main.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/vm/vmcore/src/thread/mon_enter_exit.cpp b/vm/vmcore/src/thread/mon_enter_exit.cpp index 3444933..4227981 100644 --- a/vm/vmcore/src/thread/mon_enter_exit.cpp +++ b/vm/vmcore/src/thread/mon_enter_exit.cpp @@ -69,8 +69,11 @@ void vm_enumerate_root_set_mon_arrays() { } +extern "C" __declspec(dllimport) unsigned TM_LOCK_RESERVATION; + void vm_monitor_init() { + TM_LOCK_RESERVATION = vm_get_boolean_property_value_with_default("thread.lock_reservation"); vm_monitor_enter = vm_monitor_enter_default; vm_monitor_try_enter = vm_monitor_try_enter_default; vm_monitor_exit = vm_monitor_exit_default; -- 1.4.4.1.gc94a