/*
 * Copyright (c) 2001, 2009, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 *
 */

package sun.jvm.hotspot.runtime;

import sun.jvm.hotspot.debugger.*;
import sun.jvm.hotspot.utilities.*;

public class MonitorInfo {
  private OopHandle owner;
  private BasicLock lock;
  private OopHandle ownerKlass;
  private boolean eliminated;
  private boolean ownerIsScalarReplaced;

  public MonitorInfo(OopHandle owner, BasicLock lock, boolean eliminated, boolean ownerIsScalarReplaced) {
    if (!ownerIsScalarReplaced) {
      this.owner = owner;
      this.ownerKlass = null;
    } else {
      Assert.that(eliminated, "monitor should be eliminated for scalar replaced object");
      this.owner = null;
      this.ownerKlass = owner;
    }
    this.eliminated = eliminated;
    this.ownerIsScalarReplaced = ownerIsScalarReplaced;
  }

  public OopHandle owner() {
   Assert.that(!ownerIsScalarReplaced, "should not be called for scalar replaced object");
   return owner;
  }

  public OopHandle ownerKlass() {
   Assert.that(ownerIsScalarReplaced, "should not be called for not scalar replaced object");
   return ownerKlass;
  }

  public BasicLock lock()  { return lock; }
  public boolean eliminated() { return eliminated; }
  public boolean ownerIsScalarReplaced() { return ownerIsScalarReplaced; }
}
