/** * Unregisters current thread from waiters list. */ private void unregisterWaiter() { Node prev = null; Object cur = state; while (cur != null) { if(cur.getClass() != Node.class) return; Object curWaiter = ((Node)cur).val; Node next = ((Node)cur).next; if (curWaiter == Thread.currentThread()) { if (prev == null) { Object n = next == null ? INIT : next; cur = compareAndSetState(cur, n) ? null : state; } else { prev.next = next; cur = null; } } else { prev = (Node)cur; cur = next; } } }
/** * Resets future for subsequent reuse. */ public void reset() { final Object oldState = state; if (oldState == INIT) return; if (!isDone(oldState)) throw new IgniteException("Illegal state"); compareAndSetState(oldState, INIT); }
/** * @param waiter Waiter to register. * @return {@code True} if was registered successfully. */ private boolean registerWaiter(Object waiter) { Node node = null; while (true) { final Object oldState = state; if (isDone(oldState)) return false; if(node == null) node = new Node(waiter); if(oldState != INIT && oldState.getClass() == Node.class) node.next = (Node)oldState; if (compareAndSetState(oldState, node)) return true; } }
/** * @param res Result. * @param err Error. * @param cancel {@code True} if future is being cancelled. * @return {@code True} if result was set by this call. */ protected boolean onDone(@Nullable R res, @Nullable Throwable err, boolean cancel) { Object newState = cancel ? CANCELLED : err != null ? new ErrorWrapper(err) : res; while (true) { final Object oldState = state; if (isDone(oldState)) return false; if (compareAndSetState(oldState, newState)) { if(oldState != INIT) unblockAll((Node)oldState); return true; } } }
/** * Unregisters current thread from waiters list. */ private void unregisterWaiter() { Node prev = null; Object cur = state; while (cur != null) { if(cur.getClass() != Node.class) return; Object curWaiter = ((Node)cur).val; Node next = ((Node)cur).next; if (curWaiter == Thread.currentThread()) { if (prev == null) { Object n = next == null ? INIT : next; cur = compareAndSetState(cur, n) ? null : state; } else { prev.next = next; cur = null; } } else { prev = (Node)cur; cur = next; } } }
/** * Resets future for subsequent reuse. */ public void reset() { final Object oldState = state; if (oldState == INIT) return; if (!isDone(oldState)) throw new IgniteException("Illegal state"); compareAndSetState(oldState, INIT); }
/** * @param waiter Waiter to register. * @return {@code True} if was registered successfully. */ private boolean registerWaiter(Object waiter) { Node node = null; while (true) { final Object oldState = state; if (isDone(oldState)) return false; if(node == null) node = new Node(waiter); if(oldState != INIT && oldState.getClass() == Node.class) node.next = (Node)oldState; if (compareAndSetState(oldState, node)) return true; } }
/** * @param res Result. * @param err Error. * @param cancel {@code True} if future is being cancelled. * @return {@code True} if result was set by this call. */ protected boolean onDone(@Nullable R res, @Nullable Throwable err, boolean cancel) { Object newState = cancel ? CANCELLED : err != null ? new ErrorWrapper(err) : res; while (true) { final Object oldState = state; if (isDone(oldState)) return false; if (compareAndSetState(oldState, newState)) { if(oldState != INIT) unblockAll((Node)oldState); return true; } } }