private void addToStackBottom(Entry<V> e) { e.stackNext = stack; e.stackPrev = stack.stackPrev; e.stackPrev.stackNext = e; stack.stackPrev = e; stackSize++; }
private void addToStack(Entry<V> e) { e.stackPrev = stack; e.stackNext = stack.stackNext; e.stackNext.stackPrev = e; stack.stackNext = e; stackSize++; e.topMove = stackMoveCounter++; }
/** * Create a new cache segment. * * @param maxMemory the maximum memory to use * @param stackMoveDistance the number of other entries to be moved to the top of the stack * before moving an entry to the top * @param len the number of hash table buckets (must be a power of 2) */ Segment(long maxMemory, int stackMoveDistance, int len) { setMaxMemory(maxMemory); this.stackMoveDistance = stackMoveDistance; // the bit mask has all bits set mask = len - 1; // initialize the stack and queue heads stack = new Entry<V>(); stack.stackPrev = stack.stackNext = stack; queue = new Entry<V>(); queue.queuePrev = queue.queueNext = queue; queue2 = new Entry<V>(); queue2.queuePrev = queue2.queueNext = queue2; @SuppressWarnings("unchecked") Entry<V>[] e = new Entry[len]; entries = e; }
/** * Remove the entry from the stack. The head itself must not be removed. * * @param e the entry */ private void removeFromStack(Entry<V> e) { e.stackPrev.stackNext = e.stackNext; e.stackNext.stackPrev = e.stackPrev; e.stackPrev = e.stackNext = null; stackSize--; }