/*
* Copyright 2012 LinkedIn, Inc
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.linkedin.parseq.internal;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.atomic.AtomicLong;
/**
* @author Chris Pettitt (cpettitt@linkedin.com)
*/
public class FIFOPriorityQueue<T extends Prioritizable> implements SerialExecutor.TaskQueue<T> {
private final BlockingQueue<Entry<T>> _queue = new PriorityBlockingQueue<>();
private final AtomicLong _sequenceNumber = new AtomicLong();
public FIFOPriorityQueue() {}
public void add(T value) {
_queue.add(new Entry<T>(_sequenceNumber.getAndIncrement(), value));
}
public T poll() {
final Entry<T> entry = _queue.poll();
return entry == null ? null : entry._value;
}
private static class Entry<T extends Prioritizable> implements Comparable<Entry<T>> {
private final long _sequenceNumber;
private final T _value;
private Entry(final long sequenceNumber, final T value) {
_sequenceNumber = sequenceNumber;
_value = value;
}
@Override
public int compareTo(final Entry<T> o) {
final int comp = compare(o._value.getPriority(), _value.getPriority());
return comp == 0 ? compare(_sequenceNumber, o._sequenceNumber) : comp;
}
private int compare(final long lhs, final long rhs) {
if (lhs < rhs) {
return -1;
} else if (lhs > rhs) {
return 1;
}
return 0;
}
}
}