Skip to content

Commit d0175e0

Browse files
committed
clean up buffered data sink.
1 parent cc428af commit d0175e0

File tree

2 files changed

+20
-13
lines changed

2 files changed

+20
-13
lines changed

AndroidAsync/src/com/koushikdutta/async/BufferedDataSink.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ public boolean isBuffering() {
1313
return mPendingWrites.hasRemaining() || forceBuffering;
1414
}
1515

16+
public boolean isWritable() {
17+
synchronized (mPendingWrites) {
18+
return mPendingWrites.remaining() < mMaxBuffer;
19+
}
20+
}
21+
1622
public DataSink getDataSink() {
1723
return mDataSink;
1824
}
@@ -49,22 +55,26 @@ private void writePending() {
4955

5056
final ByteBufferList mPendingWrites = new ByteBufferList();
5157

52-
@Override
53-
public void write(ByteBufferList bb) {
54-
write(bb, false);
58+
// before the data is queued, let inheritors know. allows for filters, without
59+
// issues with having to filter before writing which may fail in the buffer.
60+
protected void onDataAccepted(ByteBufferList bb) {
5561
}
5662

57-
protected void write(final ByteBufferList bb, final boolean ignoreBuffer) {
63+
@Override
64+
public void write(final ByteBufferList bb) {
5865
if (getServer().getAffinity() != Thread.currentThread()) {
5966
synchronized (mPendingWrites) {
60-
if (mPendingWrites.remaining() >= mMaxBuffer && !ignoreBuffer)
67+
if (mPendingWrites.remaining() >= mMaxBuffer)
6168
return;
69+
onDataAccepted(bb);
6270
bb.get(mPendingWrites);
6371
}
6472
getServer().post(this::writePending);
6573
return;
6674
}
6775

76+
onDataAccepted(bb);
77+
6878
if (!isBuffering())
6979
mDataSink.write(bb);
7080

AndroidAsync/src/com/koushikdutta/async/FilteredDataSink.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,12 @@ public ByteBufferList filter(ByteBufferList bb) {
1111
}
1212

1313
@Override
14-
public final void write(ByteBufferList bb) {
15-
// don't filter and write if currently buffering, unless we know
16-
// that the buffer can fit the entirety of the filtered result
17-
if (isBuffering() && getMaxBuffer() != Integer.MAX_VALUE)
18-
return;
14+
protected void onDataAccepted(ByteBufferList bb) {
1915
ByteBufferList filtered = filter(bb);
20-
assert bb == null || filtered == bb || bb.isEmpty();
21-
super.write(filtered, true);
22-
if (bb != null)
16+
// filtering may return the same byte buffer, so watch for that.
17+
if (filtered != bb) {
2318
bb.recycle();
19+
filtered.get(bb);
20+
}
2421
}
2522
}

0 commit comments

Comments
 (0)