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> {
|
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();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user