@Stage("Locks")
 public void readUnlockAndDecrementCount() {
   switch (localLockState) {
     case UNLOCKED:
       return;
     case READ_LOCKED:
       if (decrementRead() == 0) {
         if (updateZero() && writeZero()) segmentHeader.readUnlock(segmentHeaderAddress);
       }
       return;
     case UPDATE_LOCKED:
       if (decrementUpdate() == 0) {
         if (writeZero()) {
           if (readZero()) {
             segmentHeader.updateUnlock(segmentHeaderAddress);
           } else {
             segmentHeader.downgradeUpdateToReadLock(segmentHeaderAddress);
           }
         }
       }
       return;
     case WRITE_LOCKED:
       if (decrementWrite() == 0) {
         if (!updateZero()) {
           segmentHeader.downgradeWriteToUpdateLock(segmentHeaderAddress);
         } else {
           if (!readZero()) {
             segmentHeader.downgradeWriteToReadLock(segmentHeaderAddress);
           } else {
             segmentHeader.writeUnlock(segmentHeaderAddress);
           }
         }
       }
   }
 }
  @Stage("Locks")
  private void closeRootLocks() {
    verifyInnermostContext();

    switch (localLockState) {
      case UNLOCKED:
        return;
      case READ_LOCKED:
        segmentHeader.readUnlock(segmentHeaderAddress);
        return;
      case UPDATE_LOCKED:
        segmentHeader.updateUnlock(segmentHeaderAddress);
        return;
      case WRITE_LOCKED:
        segmentHeader.writeUnlock(segmentHeaderAddress);
    }
  }