Reduce conditionals in AbstractReferenceCounted
Motivation: AbstractReferenceCounted as independent conditional statements to check the bounds of the retain IllegalReferenceCountException condition. One of the exceptions also uses the incorrect increment. Modifications: - Combined independent conditional checks into 1 where possible - Correct IllegalReferenceCountException with incorrect increment - Remove the subtract to check for overflow and re-use the addition and check for overflow to remove 1 arithmetic operation (see http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.18.2) Result: AbstractReferenceCounted has less independent branch statements and more correct IllegalReferenceCountException. Compilation size of AbstractReferenceCounted.retain() is reduced from 58 bytes to 47 bytes.
This commit is contained in:
parent
d315f1b3ba
commit
01523e7835
@ -53,11 +53,8 @@ public abstract class AbstractReferenceCounted implements ReferenceCounted {
|
|||||||
public ReferenceCounted retain() {
|
public ReferenceCounted retain() {
|
||||||
for (;;) {
|
for (;;) {
|
||||||
int refCnt = this.refCnt;
|
int refCnt = this.refCnt;
|
||||||
if (refCnt == 0) {
|
if (refCnt == 0 || refCnt == Integer.MAX_VALUE) {
|
||||||
throw new IllegalReferenceCountException(0, 1);
|
throw new IllegalReferenceCountException(refCnt, 1);
|
||||||
}
|
|
||||||
if (refCnt == Integer.MAX_VALUE) {
|
|
||||||
throw new IllegalReferenceCountException(Integer.MAX_VALUE, 1);
|
|
||||||
}
|
}
|
||||||
if (refCntUpdater.compareAndSet(this, refCnt, refCnt + 1)) {
|
if (refCntUpdater.compareAndSet(this, refCnt, refCnt + 1)) {
|
||||||
break;
|
break;
|
||||||
@ -73,14 +70,12 @@ public abstract class AbstractReferenceCounted implements ReferenceCounted {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
final int nextCnt;
|
||||||
int refCnt = this.refCnt;
|
int refCnt = this.refCnt;
|
||||||
if (refCnt == 0) {
|
if (refCnt == 0 || (nextCnt = refCnt + increment) < 0) {
|
||||||
throw new IllegalReferenceCountException(0, 1);
|
|
||||||
}
|
|
||||||
if (refCnt > Integer.MAX_VALUE - increment) {
|
|
||||||
throw new IllegalReferenceCountException(refCnt, increment);
|
throw new IllegalReferenceCountException(refCnt, increment);
|
||||||
}
|
}
|
||||||
if (refCntUpdater.compareAndSet(this, refCnt, refCnt + increment)) {
|
if (refCntUpdater.compareAndSet(this, refCnt, nextCnt)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user