001/*
002 *  This file is part of the Jikes RVM project (http://jikesrvm.org).
003 *
004 *  This file is licensed to You under the Eclipse Public License (EPL);
005 *  You may not use this file except in compliance with the License. You
006 *  may obtain a copy of the License at
007 *
008 *      http://www.opensource.org/licenses/eclipse-1.0.php
009 *
010 *  See the COPYRIGHT.txt file distributed with this work for information
011 *  regarding copyright ownership.
012 */
013package org.jikesrvm.scheduler;
014
015import org.vmmagic.pragma.Uninterruptible;
016import org.vmmagic.pragma.Unpreemptible;
017import org.vmmagic.pragma.NonMoving;
018import org.vmmagic.pragma.NoOptCompile;
019import org.vmmagic.pragma.NoInline;
020import org.jikesrvm.VM;
021
022/**
023 * A heavy condition variable and lock that also disables interrupts while
024 * the lock is held.  Extremely useful for any locks that may be acquired,
025 * released, or waited upon in the process of performing a GC.
026 * <p>
027 * Note that calling any of the withHandshake methods on an instance of this
028 * class is extremely dangerous.  These methods may cause you to block on
029 * GC, which seemingly goes against the very intent of this being a "no
030 * interrupts" condition variable and lock.  However, it makes a subtle
031 * kind of sense to use these methods, <i>if you're calling them on the
032 * instance of NoInterruptsCondLock that your thread will wait on when
033 * blocking on GC</i>.  This idiom is used quite a bit.
034 * <p>
035 * To ensure that the withHandshake methods are used correctly - that is, that
036 * they are only used by the thread that owns the lock - there are assertions
037 * in place to ensure that the caller is the owner.
038 */
039@Uninterruptible
040@NonMoving
041public class NoYieldpointsMonitor extends Monitor {
042  @Override
043  @NoInline
044  @NoOptCompile
045  public void lockNoHandshake() {
046    VM.disableYieldpoints();
047    super.lockNoHandshake();
048  }
049
050  // This method is strange
051  @Override
052  @Unpreemptible
053  @NoInline
054  @NoOptCompile
055  public void lockWithHandshake() {
056    VM.disableYieldpoints();
057    super.lockWithHandshake();
058  }
059
060  @Override
061  @NoInline
062  @NoOptCompile
063  public void unlock() {
064    super.unlock();
065    VM.enableYieldpoints();
066  }
067}
068