示例#1
0
  /** 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);
  }
示例#2
0
 void testClear() {
   for (; _heapTop > 0; _heapTop--) {
     Alarm alarm = _heap[_heapTop];
     alarm.setHeapIndex(0);
     _heap[_heapTop] = null;
   }
 }
示例#3
0
  /** 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);
    }
  }