Skip to content

Commit

Permalink
fix for stackoverflow when low on memory and created array removed im…
Browse files Browse the repository at this point in the history
…mediately
  • Loading branch information
wizzardo committed Oct 15, 2023
1 parent 430b929 commit 370e787
Showing 1 changed file with 21 additions and 5 deletions.
26 changes: 21 additions & 5 deletions src/main/java/com/wizzardo/http/ReadableByteArrayPool.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,27 +10,38 @@
* Created by wizzardo on 26/05/16.
*/
public class ReadableByteArrayPool {
private static Pool<PooledReadableByteArray> pool = new PoolBuilder<PooledReadableByteArray>()
private static final Pool<PooledReadableByteArray> pool = new PoolBuilder<PooledReadableByteArray>()
.queue(PoolBuilder.createThreadLocalQueueSupplier())
.supplier(() -> new PooledReadableByteArray(new byte[10240]))
.holder((pool, value) -> value.holder = new SoftHolder<>(pool, value))
.holder(SoftHolder::new)
.resetter(PooledReadableByteArray::reset)
.build();

private static class SoftHolder<T> implements Holder<T> {
public interface WithHolder<T> {
void setHolder(Holder<T> holder);
}

private static class SoftHolder<T extends WithHolder<T>> implements Holder<T> {
final Pool<T> pool;
volatile SoftReference<T> ref;

private SoftHolder(Pool<T> pool, T value) {
this.pool = pool;
value.setHolder(this);
ref = new SoftReference<>(value);
}

@Override
public T get() {
T value = ref.get();
if (value == null) {
return pool.holder().get();
if (pool.size() > 0)
return pool.holder().get();
else {
T t = pool.create();
new SoftHolder<>(pool, t);
return t;
}
} else {
pool.reset(value);
}
Expand All @@ -43,7 +54,7 @@ public void close() {
}
}

public static class PooledReadableByteArray extends ReadableByteArray {
public static class PooledReadableByteArray extends ReadableByteArray implements WithHolder<PooledReadableByteArray>{
private volatile Holder<PooledReadableByteArray> holder;

PooledReadableByteArray(byte[] bytes) {
Expand All @@ -67,6 +78,11 @@ public void reset() {
length = bytes.length;
position = 0;
}

@Override
public void setHolder(Holder<PooledReadableByteArray> holder) {
this.holder = holder;
}
}

public static PooledReadableByteArray get() {
Expand Down

0 comments on commit 370e787

Please sign in to comment.