if (VM.VerifyAssertions) VM.assert(VM_Thread.getCurrentThread().isGCThread);
if (VM.VerifyAssertions) VM._assert(VM_Thread.getCurrentThread().isGCThread);
  boolean lockHeavy (Object o) {    if (tentativeMicrolocking) {      if (!mutex.tryLock()) 	return false;    } else mutex.lock();  // Note: thread switching is not allowed while mutex is held.    if (lockedObject != o) { // lock disappeared before we got here      mutex.unlock(); // thread switching benign      return false;    }    if (STATS) lockOperations++;    if (ownerId == VM_Magic.getThreadId()) {      recursionCount ++;    } else if (ownerId == 0) {      ownerId = VM_Magic.getThreadId();      recursionCount = 1;    } else if (VM_Processor.getCurrentProcessor().threadSwitchingEnabled()) {      VM_Thread.yield(entering, mutex); // thread-switching benign      // when this thread next gets scheduled, it will be entitled to the lock,      // but another thread might grab it first.      return false; // caller will try again    } else { // can't yield - must spin and let caller retry      // potential deadlock if user thread is contending for a lock with thread switching disabled      if (VM.VerifyAssertions) VM.assert(VM_Thread.getCurrentThread().isGCThread);      mutex.unlock(); // thread-switching benign      return false; // caller will try again    }    mutex.unlock(); // thread-switching benign    return true;  }