summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathieu Chartier <mathieuc@google.com>2014-09-06 14:25:55 -0700
committerMathieu Chartier <mathieuc@google.com>2014-09-08 13:56:33 -0700
commit6917aebf2eb26c2b003a72d09c1c5bb6310160b0 (patch)
tree3882a7ad61cf04dbd620019abf95925cd92f9158
parentd0ce966016703de5783ac5097131d7a738d8b007 (diff)
downloadlibcore-6917aebf2eb26c2b003a72d09c1c5bb6310160b0.zip
libcore-6917aebf2eb26c2b003a72d09c1c5bb6310160b0.tar.gz
libcore-6917aebf2eb26c2b003a72d09c1c5bb6310160b0.tar.bz2
Add handling for hashed uninflated object.
This is an Optimization to reduce how often we call System.identityHashCode. If the lockword is set to the hash code state then we simply return this value. Otherwise, we use System.identityHashCode. Maps launch exclusive time spent in System.identityHashCode: Before: 4.5% After: 2.4% Bug: 16828525 Change-Id: Ic60280b859547cd7fa7db97005a1aa9340c58304
-rw-r--r--libart/src/main/java/java/lang/Object.java6
1 files changed, 6 insertions, 0 deletions
diff --git a/libart/src/main/java/java/lang/Object.java b/libart/src/main/java/java/lang/Object.java
index acae8ca..20fdbf9 100644
--- a/libart/src/main/java/java/lang/Object.java
+++ b/libart/src/main/java/java/lang/Object.java
@@ -273,6 +273,12 @@ public class Object {
* @see #equals
*/
public int hashCode() {
+ int lockWord = shadow$_monitor_;
+ final int lockWordMask = 0xC0000000; // Top 2 bits.
+ final int lockWordStateHash = 0x80000000; // Top 2 bits are value 2 (kStateHash).
+ if ((lockWord & lockWordMask) == lockWordStateHash) {
+ return lockWord & ~lockWordMask;
+ }
return System.identityHashCode(this);
}