More safety in DefaultMessageBuf

This commit is contained in:
Trustin Lee 2013-02-13 14:58:21 -08:00
parent a3cb3651d0
commit a1540a49d3

View File

@ -31,6 +31,7 @@ import java.util.NoSuchElementException;
final class DefaultMessageBuf<T> extends AbstractMessageBuf<T> {
private static final int MIN_INITIAL_CAPACITY = 8;
private static final Object[] PLACEHOLDER = new Object[2];
private T[] elements;
private int head;
@ -77,22 +78,9 @@ final class DefaultMessageBuf<T> extends AbstractMessageBuf<T> {
@Override
protected void deallocate() {
int head = this.head;
int tail = this.tail;
if (head != tail) {
this.head = this.tail = 0;
final int mask = elements.length - 1;
int i = head;
do {
BufUtil.release(elements[i]);
elements[i] = null;
i = i + 1 & mask;
} while (i != tail);
}
elements = cast(new Object[2]);
this.head = 0;
this.tail = 0;
head = 0;
tail = 0;
elements = cast(PLACEHOLDER);
}
@Override
@ -100,6 +88,8 @@ final class DefaultMessageBuf<T> extends AbstractMessageBuf<T> {
if (e == null) {
throw new NullPointerException();
}
ensureAccessible();
if (!isWritable()) {
return false;
}
@ -132,6 +122,7 @@ final class DefaultMessageBuf<T> extends AbstractMessageBuf<T> {
@Override
public T poll() {
ensureAccessible();
int h = head;
T result = elements[h]; // Element is null if deque empty
if (result == null) {
@ -144,6 +135,7 @@ final class DefaultMessageBuf<T> extends AbstractMessageBuf<T> {
@Override
public T peek() {
ensureAccessible();
return elements[head]; // elements[head] is null if deque empty
}
@ -152,6 +144,8 @@ final class DefaultMessageBuf<T> extends AbstractMessageBuf<T> {
if (o == null) {
return false;
}
ensureAccessible();
int mask = elements.length - 1;
int i = head;
T x;
@ -221,6 +215,7 @@ final class DefaultMessageBuf<T> extends AbstractMessageBuf<T> {
@Override
public Iterator<T> iterator() {
ensureAccessible();
return new Itr();
}
@ -230,6 +225,7 @@ final class DefaultMessageBuf<T> extends AbstractMessageBuf<T> {
return false;
}
ensureAccessible();
final int mask = elements.length - 1;
int i = head;
Object e;
@ -245,6 +241,7 @@ final class DefaultMessageBuf<T> extends AbstractMessageBuf<T> {
@Override
public void clear() {
ensureAccessible();
int head = this.head;
int tail = this.tail;
if (head != tail) {
@ -260,11 +257,13 @@ final class DefaultMessageBuf<T> extends AbstractMessageBuf<T> {
@Override
public Object[] toArray() {
ensureAccessible();
return copyElements(new Object[size()]);
}
@Override
public <T> T[] toArray(T[] a) {
ensureAccessible();
int size = size();
if (a.length < size) {
a = cast(Array.newInstance(a.getClass().getComponentType(), size));
@ -299,11 +298,13 @@ final class DefaultMessageBuf<T> extends AbstractMessageBuf<T> {
@Override
public boolean hasNext() {
ensureAccessible();
return cursor != fence;
}
@Override
public T next() {
ensureAccessible();
if (cursor == fence) {
throw new NoSuchElementException();
}
@ -320,6 +321,7 @@ final class DefaultMessageBuf<T> extends AbstractMessageBuf<T> {
@Override
public void remove() {
ensureAccessible();
if (lastRet < 0) {
throw new IllegalStateException();
}