src/share/vm/runtime/basicLock.cpp

Wed, 09 Oct 2013 16:32:21 +0200

author
roland
date
Wed, 09 Oct 2013 16:32:21 +0200
changeset 5914
d13d7aba8c12
parent 2314
f95d63e2154a
child 6876
710a3c8b516e
child 7605
6e8e0bf87bbe
permissions
-rw-r--r--

8023657: New type profiling points: arguments to call
Summary: x86 interpreter and c1 type profiling for arguments at calls
Reviewed-by: kvn, twisti

acorn@2233 1 /*
acorn@2233 2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
acorn@2233 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
acorn@2233 4 *
acorn@2233 5 * This code is free software; you can redistribute it and/or modify it
acorn@2233 6 * under the terms of the GNU General Public License version 2 only, as
acorn@2233 7 * published by the Free Software Foundation.
acorn@2233 8 *
acorn@2233 9 * This code is distributed in the hope that it will be useful, but WITHOUT
acorn@2233 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
acorn@2233 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
acorn@2233 12 * version 2 for more details (a copy is included in the LICENSE file that
acorn@2233 13 * accompanied this code).
acorn@2233 14 *
acorn@2233 15 * You should have received a copy of the GNU General Public License version
acorn@2233 16 * 2 along with this work; if not, write to the Free Software Foundation,
acorn@2233 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
acorn@2233 18 *
acorn@2233 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
acorn@2233 20 * or visit www.oracle.com if you need additional information or have any
acorn@2233 21 * questions.
acorn@2233 22 *
acorn@2233 23 */
acorn@2233 24
stefank@2314 25 #include "precompiled.hpp"
stefank@2314 26 #include "runtime/basicLock.hpp"
stefank@2314 27 #include "runtime/synchronizer.hpp"
acorn@2233 28
acorn@2233 29 void BasicLock::print_on(outputStream* st) const {
acorn@2233 30 st->print("monitor");
acorn@2233 31 }
acorn@2233 32
acorn@2233 33 void BasicLock::move_to(oop obj, BasicLock* dest) {
acorn@2233 34 // Check to see if we need to inflate the lock. This is only needed
acorn@2233 35 // if an object is locked using "this" lightweight monitor. In that
acorn@2233 36 // case, the displaced_header() is unlocked, because the
acorn@2233 37 // displaced_header() contains the header for the originally unlocked
acorn@2233 38 // object. However the object could have already been inflated. But it
acorn@2233 39 // does not matter, the inflation will just a no-op. For other cases,
acorn@2233 40 // the displaced header will be either 0x0 or 0x3, which are location
acorn@2233 41 // independent, therefore the BasicLock is free to move.
acorn@2233 42 //
acorn@2233 43 // During OSR we may need to relocate a BasicLock (which contains a
acorn@2233 44 // displaced word) from a location in an interpreter frame to a
acorn@2233 45 // new location in a compiled frame. "this" refers to the source
acorn@2233 46 // basiclock in the interpreter frame. "dest" refers to the destination
acorn@2233 47 // basiclock in the new compiled frame. We *always* inflate in move_to().
acorn@2233 48 // The always-Inflate policy works properly, but in 1.5.0 it can sometimes
acorn@2233 49 // cause performance problems in code that makes heavy use of a small # of
acorn@2233 50 // uncontended locks. (We'd inflate during OSR, and then sync performance
acorn@2233 51 // would subsequently plummet because the thread would be forced thru the slow-path).
acorn@2233 52 // This problem has been made largely moot on IA32 by inlining the inflated fast-path
acorn@2233 53 // operations in Fast_Lock and Fast_Unlock in i486.ad.
acorn@2233 54 //
acorn@2233 55 // Note that there is a way to safely swing the object's markword from
acorn@2233 56 // one stack location to another. This avoids inflation. Obviously,
acorn@2233 57 // we need to ensure that both locations refer to the current thread's stack.
acorn@2233 58 // There are some subtle concurrency issues, however, and since the benefit is
acorn@2233 59 // is small (given the support for inflated fast-path locking in the fast_lock, etc)
acorn@2233 60 // we'll leave that optimization for another time.
acorn@2233 61
acorn@2233 62 if (displaced_header()->is_neutral()) {
acorn@2233 63 ObjectSynchronizer::inflate_helper(obj);
acorn@2233 64 // WARNING: We can not put check here, because the inflation
acorn@2233 65 // will not update the displaced header. Once BasicLock is inflated,
acorn@2233 66 // no one should ever look at its content.
acorn@2233 67 } else {
acorn@2233 68 // Typically the displaced header will be 0 (recursive stack lock) or
acorn@2233 69 // unused_mark. Naively we'd like to assert that the displaced mark
acorn@2233 70 // value is either 0, neutral, or 3. But with the advent of the
acorn@2233 71 // store-before-CAS avoidance in fast_lock/compiler_lock_object
acorn@2233 72 // we can find any flavor mark in the displaced mark.
acorn@2233 73 }
acorn@2233 74 // [RGV] The next line appears to do nothing!
acorn@2233 75 intptr_t dh = (intptr_t) displaced_header();
acorn@2233 76 dest->set_displaced_header(displaced_header());
acorn@2233 77 }

mercurial