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