/** * Transfers node, if necessary, to sync queue after a cancelled wait. Returns * true if thread was cancelled before being signalled. * * @param node * its node * @return true if cancelled before the node was signalled. */ final boolean transferAfterCancelledWait(Node node) { if (compareAndSetWaitStatus(node, Node.CONDITION, 0)) { enq(node); return true; } /* * If we lost out to a signal(), then we can't proceed * until it finishes its enq(). Cancelling during an * incomplete transfer is both rare and transient, so just * spin. */ while (!isOnSyncQueue(node)) Thread.yield(); return false; }