throw new IllegalMonitorStateException("heavy unlocking " + o);
raiseIllegalMonitorStateException("heavy unlocking", o);
  void unlockHeavy (Object o) {    boolean deflated = false;    mutex.lock(); // Note: thread switching is not allowed while mutex is held.    if (ownerId != VM_Magic.getThreadId()) {      mutex.unlock(); // thread-switching benign      throw new IllegalMonitorStateException("heavy unlocking " + o);    }    if (0 < --recursionCount) {      mutex.unlock(); // thread-switching benign      return;    }    if (STATS) unlockOperations++;    ownerId = 0;    VM_Thread t = entering.dequeue();    if (t != null) t.scheduleHighPriority();    else if (entering.isEmpty() && waiting.isEmpty()) { // heavy lock can be deflated      // Possible project: decide on a heuristic to control when lock should be deflated      int lockOffset = VM_Magic.getObjectType(o).thinLockOffset;      if (lockOffset != -1) { // deflate heavy lock	deflate(o, lockOffset);	deflated = true;      }    }    mutex.unlock(); // does a VM_Magic.sync();  (thread-switching benign)    if (deflated && ((LOCK_ALLOCATION_UNIT_SIZE<<1) <= VM_Processor.getCurrentProcessor().freeLocks) && balanceFreeLocks)      globalizeFreeLocks();  }