From ad2541a59c00c2c69e8973088891a2b5257c9780 Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Fri, 25 Oct 2013 10:05:23 -0700 Subject: Fix object identity hash. The object identity hash is now stored in the monitor word after being computed. Hashes are computed by a pseudo random number generator. When we write the image, we eagerly compute object hashes to prevent pages getting dirtied. Bug: 8981901 Change-Id: Ic8edacbacb0afc7055fd740a52444929f88ed564 --- runtime/arch/x86/quick_entrypoints_x86.S | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'runtime/arch/x86') diff --git a/runtime/arch/x86/quick_entrypoints_x86.S b/runtime/arch/x86/quick_entrypoints_x86.S index 805f6f4..4e79770 100644 --- a/runtime/arch/x86/quick_entrypoints_x86.S +++ b/runtime/arch/x86/quick_entrypoints_x86.S @@ -411,9 +411,10 @@ DEFINE_FUNCTION art_quick_lock_object jz slow_lock retry_lock: movl LOCK_WORD_OFFSET(%eax), %ecx // ecx := lock word + test LITERAL(0xC0000000), %ecx // test the 2 high bits. + jne slow_lock // slow path if either of the two high bits are set. movl %fs:THREAD_ID_OFFSET, %edx // edx := thread id test %ecx, %ecx - jb slow_lock // lock word contains a monitor jnz already_thin // lock word contains a thin lock // unlocked case - %edx holds thread id with count of 0 movl %eax, %ecx // remember object in case of retry @@ -428,7 +429,8 @@ already_thin: cmpw %ax, %dx // do we hold the lock already? jne slow_lock addl LITERAL(65536), %eax // increment recursion count - jb slow_lock // count overflowed so go slow + test LITERAL(0xC0000000), %eax // overflowed if either of top two bits are set + jne slow_lock // count overflowed so go slow movl %eax, LOCK_WORD_OFFSET(%ecx) // update lockword, cmpxchg not necessary as we hold lock ret slow_lock: -- cgit v1.1