/** Adds the alarm item. Must be called from within the heap lock. */ private boolean insertImpl(Alarm alarm) { if (alarm.getHeapIndex() != 0) throw new IllegalStateException(); // resize if necessary if (_heap.length <= _heapTop + 2) { Alarm[] newHeap = new Alarm[2 * _heap.length]; System.arraycopy(_heap, 0, newHeap, 0, _heap.length); _heap = newHeap; } Alarm[] heap = _heap; int i = ++_heapTop; int parent = 0; Alarm item = null; long wakeTime = alarm.getWakeTime(); while (i > 1 && wakeTime < (item = heap[parent = (i >> 1)]).getWakeTime()) { heap[i] = item; item.setHeapIndex(i); i = parent; } heap[i] = alarm; alarm.setHeapIndex(i); if (_heapTop < i) throw new IllegalStateException("i=" + i + " top=" + _heapTop); if (i < 1) throw new IllegalStateException("i=" + i); return (i == 1); }
void testClear() { for (; _heapTop > 0; _heapTop--) { Alarm alarm = _heap[_heapTop]; alarm.setHeapIndex(0); _heap[_heapTop] = null; } }
/** Removes the alarm item. Must be called from within the heap lock. */ private void dequeueImpl(Alarm item) { int i = item.getHeapIndex(); if (i < 1) return; if (_heapTop < i) throw new IllegalStateException("bad heap: " + _heapTop + " index:" + i); Alarm[] heap = _heap; if (_heapTop < 1) throw new IllegalStateException(); int size = _heapTop--; heap[i] = heap[size]; heap[i].setHeapIndex(i); heap[size] = null; item.setHeapIndex(0); if (size == i) return; if (item.getWakeTime() < heap[i].getWakeTime()) { while (i < size) { item = heap[i]; int minIndex = i; long minWakeTime = item.getWakeTime(); int left = i << 1; if (left < size && heap[left].getWakeTime() < minWakeTime) { minIndex = left; minWakeTime = heap[left].getWakeTime(); } int right = left + 1; if (right < size && heap[right].getWakeTime() < minWakeTime) minIndex = right; if (i == minIndex) return; heap[i] = heap[minIndex]; heap[i].setHeapIndex(i); heap[minIndex] = item; item.setHeapIndex(minIndex); i = minIndex; } } else { int parent; Alarm alarm; item = heap[i]; long wakeTime = item.getWakeTime(); while (i > 1 && wakeTime < (alarm = heap[parent = (i >> 1)]).getWakeTime()) { heap[i] = alarm; alarm.setHeapIndex(i); i = parent; } heap[i] = item; item.setHeapIndex(i); } }