More safety in DefaultMessageBuf
This commit is contained in:
parent
a3cb3651d0
commit
a1540a49d3
@ -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();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user