code: final long fullyRelease(Node node) {
          try {
              long savedState = getState();
              if (release(savedState))
                  return savedState;
              throw new IllegalMonitorStateException();
          } catch (Throwable t) {
              node.waitStatus = Node.CANCELLED;
              throw t;
          }
      }
docs: Invokes release with current state value; returns saved state.
  Cancels node and throws exception on failure.
  @param node the condition node for this wait
  @return previous sync state