Skip to content

Commit d0052c1

Browse files
alexmarkovcommit-bot@chromium.org
authored andcommitted
[dart:_http] Fix potentially large List<int> allocation in _WebSocketPerMessageDeflate.processIncomingMessage
processIncomingMessage() was creating List<int> to hold uncompressed bytes, which is very wastefull if size of the message is large (spending a word for each byte). Changed processIncomingMessage() to use BytesBuilder for uncompressed bytes. This fixes flaky out of memory failure on service/get_vm_timeline_rpc_test with bytecode in dartk-optcounter-linux-release-ia32 configuration. In that test size of uncompressed message exceeded 130MB, causing 1GB memory allocation (512MB List was expanded). Change-Id: Ic5a78a13bd431f5ad97496907a84a3f7ba01c1fa Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/117121 Reviewed-by: Ryan Macnak <[email protected]> Commit-Queue: Alexander Markov <[email protected]>
1 parent 4aa820b commit d0052c1

File tree

2 files changed

+6
-6
lines changed

2 files changed

+6
-6
lines changed

sdk/lib/_http/websocket_impl.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -601,19 +601,19 @@ class _WebSocketPerMessageDeflate {
601601
data.addAll(const [0x00, 0x00, 0xff, 0xff]);
602602

603603
decoder.process(data, 0, data.length);
604-
var result = <int>[];
604+
final result = new BytesBuilder();
605605
List<int> out;
606606

607607
while ((out = decoder.processed()) != null) {
608-
result.addAll(out);
608+
result.add(out);
609609
}
610610

611611
if ((serverSide && clientNoContextTakeover) ||
612612
(!serverSide && serverNoContextTakeover)) {
613613
decoder = null;
614614
}
615615

616-
return new Uint8List.fromList(result);
616+
return result.takeBytes();
617617
}
618618

619619
List<int> processOutgoingMessage(List<int> msg) {

sdk_nnbd/lib/_http/websocket_impl.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -601,19 +601,19 @@ class _WebSocketPerMessageDeflate {
601601
data.addAll(const [0x00, 0x00, 0xff, 0xff]);
602602

603603
decoder.process(data, 0, data.length);
604-
var result = <int>[];
604+
final result = new BytesBuilder();
605605
List<int> out;
606606

607607
while ((out = decoder.processed()) != null) {
608-
result.addAll(out);
608+
result.add(out);
609609
}
610610

611611
if ((serverSide && clientNoContextTakeover) ||
612612
(!serverSide && serverNoContextTakeover)) {
613613
decoder = null;
614614
}
615615

616-
return new Uint8List.fromList(result);
616+
return result.takeBytes();
617617
}
618618

619619
List<int> processOutgoingMessage(List<int> msg) {

0 commit comments

Comments
 (0)